MySQL⾯试题和答案
Mysql 的存储引擎,myisam和innodb的区别。
答:
1.MyISAM 是⾮事务的存储引擎,适合⽤于频繁查询的应⽤。表锁,不会出现死锁,适合⼩数据,⼩并发。
2.innodb是⽀持事务的存储引擎,合于插⼊和更新操作⽐较多的应⽤,设计合理的话是⾏锁(最⼤区别就在锁的级别上),适合⼤数据,⼤并发。
数据表类型有哪些
答:MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、稳定、易于管理,快速读取。⼀些功能不⽀持(事务等),表级锁。
InnoDB:⽀持事务、外键等特性、数据⾏锁定。空间占⽤⼤,不⽀持全⽂索引等。
MySQL数据库作发布系统的存储,⼀天五万条以上的增量,预计运维三年,怎么优化?
a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提⾼效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 规律分表,减少单表中的数据量提⾼查询速度。
e。添加缓存机制,⽐如memcached,apc等。
f. 不经常改动的页⾯,⽣成静态页⾯。
g. 书写⾼效率的SQL。⽐如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.
对于⼤流量的⽹站,您采⽤什么样的⽅法来解决各页⾯访问量统计问题?
答:a. 确认服务器是否能⽀撑当前访问量。
mysql面试题sql
b. 优化数据库访问。
c. 禁⽌外部访问链接(盗链), ⽐如图⽚盗链。
d. 控制⽂件下载。
e. 使⽤不同主机分流。
f. 使⽤浏览统计软件,了解访问量,有针对性的进⾏优化。
如何进⾏SQL优化?
答:
(1)选择正确的存储引擎
以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM 适合于⼀些需要⼤量查询的应⽤,但其对于有⼤量写操作并不是很好。甚⾄你只是需要update⼀个字段,整个表都会被锁起来,⽽别的进程,就算是读进程都⽆法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快⽆⽐的。
InnoDB 的趋势会是⼀个⾮常复杂的存储引擎,对于⼀些⼩的应⽤,它会⽐ MyISAM 还慢。但是它⽀持“⾏锁” ,于是在写操作⽐较多的时候,会更优秀。并且,他还⽀持更多的⾼级应⽤,⽐如:事务。
数据类型的三个组成部分
(2)优化字段的数据类型
记住⼀个原则,越⼩的列会越快。如果⼀个表只会有⼏列罢了(⽐如说字典表,配置表),那么,我们就没有理由使⽤ INT 来做主键,使⽤MEDIUMINT, SMALLINT 或是更⼩的 TINYINT 会更经济⼀些。如果你不需要记录时间,使⽤ DATE 要⽐ DATETIME 好得多。当然,你也需要留够⾜够的扩展空间。
(3)为搜索字段添加索引
周期函数图像索引并不⼀定就是给主键或是唯⼀的字段。如果在你的表中,有某个字段你总要会经常⽤来做搜索,那么最好是为其建⽴索引,除⾮你要搜索的字段是⼤的⽂本字段,那应该建⽴全⽂索引。
(4)避免使⽤Select 从数据库⾥读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独⽴的服务器的话,这还会增加⽹络传输的负载。即使你要查询数据表的所有字段,也尽量不要⽤通配符,善⽤内置提供的字段排除定义也许能给带来更多的便利。
(5)使⽤ ENUM ⽽不是 VARCHAR
ENUM 类型是⾮常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显⽰为字符串。这样⼀来,⽤这个字段来做⼀些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段matlab绘图命令plot
的取值是有限⽽且固定的,那么,你应该使⽤ ENUM ⽽不是 VARCHAR。
(6)尽可能的使⽤ NOT NULL
除⾮你有⼀个很特别的原因去使⽤ NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进⾏⽐较的时候,你的程序会更复杂。当然,这⾥并不是说你就不能使⽤NULL了,现实情况是很复杂的,依然会有些情况下,你需要使⽤NULL值。
(7)固定长度的表会更快
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。例如,表中没有如下类型的字段:
VARCHAR,TEXT,BLOB。只要你包括了其中⼀个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会⽤另⼀种⽅
法来处理。
固定长度的表会提⾼性能,因为MySQL搜寻得会更快⼀些,因为这些固定的长度是很容易计算下⼀个数据的偏移量的,所以读取的⾃然也会很快。⽽如果字段不是定长的,那么,每⼀次要下⼀条的话,需要程序到主键。
并且,固定长度的表也更容易被缓存和重建。不过,唯⼀的副作⽤是,固定长度的字段会浪费⼀些空间,因为定长的字段⽆论你⽤不⽤,他都是要分配那么多的空间。
如何设计⼀个⾼并发的系统
①数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化
②使⽤缓存,尽量减少数据库 IO
③分布式数据库、分布式缓存
④服务器的负载均衡
锁的优化策略
①读写分离
②分段加锁
③减少锁持有的时间
④多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,⽐如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反⽽效率不如⼀次加⼀把⼤锁。这部分跟⾯试官谈了很久
索引的底层实现原理和优化
B+树,经过优化的B+树
主要是在所有的叶⼦结点中增加了指向下⼀个叶⼦节点的指针,因此InnoDB建议为⼤部分表使⽤默认⾃增的主键作为主索引。
什么情况下设置了索引但⽆法使⽤
①以“%”开头的LIKE语句,模糊匹配
② OR语句前后没有同时使⽤索引
③数据类型出现隐式转化(如varchar不加单引号的话可能会⾃动转换为int型)
SQL语句的优化
order by要怎么处理
alter尽量将多次合并为⼀次
insert和delete也需要合并
等等
实践中如何优化MySQL
我当时是按以下四条依次回答的,他们四条从效果上第⼀条影响最⼤,后⾯越来越⼩。
① SQL语句及索引的优化
②数据库表结构的优化
③系统配置的优化
④硬件的优化
sql注⼊的主要特点
变种极多,攻击简单,危害极⼤
sql注⼊的主要危害
未经授权操作数据库的数据
恶意纂改⽹页
私⾃添加系统账号或者是数据库使⽤者账号
⽹页挂⽊马
优化数据库的⽅法
选取最适⽤的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、’性别’最好适⽤ENUM
使⽤连接(JOIN)来代替⼦查询
适⽤联合(UNION)来代替⼿动创建的临时表
事务处理
锁定表、优化事务处理
适⽤外键,优化锁定表
建⽴索引
优化查询语句
简单描述mysql中,索引,主键,唯⼀索引,联合索引的区别,对数据库的性能有什么影响(从读写两⽅⾯)
索引是⼀种特殊的⽂件(InnoDB数据表上的索引是表空间的⼀个组成部分),它们包含着对数据表⾥所有记录的引⽤指针。
普通索引(由关键字KEY或INDEX定义的索引)的唯⼀任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该⽤关键字UNIQUE把它定义为⼀个唯⼀索引。也就是说,唯⼀索引可以保证数据记录的唯⼀性。
主键,是⼀种特殊的唯⼀索引,在⼀张表中只能定义⼀个主键索引,主键⽤于唯⼀标识⼀条记录,使⽤关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极⼤的提⾼数据的查询速度,但是会降低插⼊、删除、更新表的速度,因为在执⾏这些写操作时,还要操作索引⽂件。
数据库中的事务是什么?
事务(transaction)是作为⼀个单元的⼀组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有⼀个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作⽤于所有其他数据库进程。如果⼀个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四⼤特性,原⼦性、隔离性、⼀致性、持久性。
了解XSS攻击吗?如何防⽌?
XSS是跨站脚本攻击,⾸先是利⽤跨站脚本漏洞以⼀个特权模式去执⾏攻击者构造的脚本,然后利⽤不安全的Activex控件执⾏恶意的⾏为。
使⽤htmlspecialchars()函数对提交的内容进⾏过滤,使字符串⾥⾯的特殊符号实体化。
SQL注⼊漏洞产⽣的原因?如何防⽌?
SQL注⼊产⽣的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进⾏过滤,导致客户端可以通过全局变量POST和GET提交⼀些sql语句正常执⾏。
防⽌SQL注⼊的⽅式:
开启配置⽂件中的magic_quotes_gpc 和 magic_quotes_runtime设置
执⾏sql语句时使⽤addslashes进⾏sql语句转换
Sql语句书写尽量不要省略双引号和单引号。
过滤掉sql语句中的⼀些关键词:update、insert、delete、select、 * 。
提⾼数据库表和字段的命名技巧,对⼀些重要的字段根据程序的特点命名,取不易被猜到的。
Php配置⽂件中设置register_globals为off,关闭全局变量注册
控制错误信息,不要在浏览器上输出错误信息,将错误信息写到⽇志⽂件中。
为表中得字段选择合适得数据类型(物理设计)
字段类型优先级: 整形>date,time>enum,char>varchar>blob,text
优先考虑数字类型,其次是⽇期或者⼆进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占⽤空间⼩的数据类型
存储时期
Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间,精确到秒,占⽤8个字节得存储空间,datatime类型与时区⽆关Timestamp:以时间戳格式存储,占⽤4个字节,范围⼩1970-1-1到2038-1-19,显⽰依赖于所指定得时区,默认在第⼀个列⾏的数据修改时可以⾃动得修改timestamp列得值
Date:(⽣⽇)占⽤得字节数⽐使⽤字符串.datatime.int储存要少,使⽤date只需要3个字节,存储⽇期⽉份,还可以利⽤⽇期时间函数进⾏⽇期间得计算
Time:存储时间部分得数据
注意:不要使⽤字符串类型来存储⽇期时间数据(通常⽐字符串占⽤得储存空间⼩,在进⾏查过滤可以利⽤⽇期得函数)
使⽤int存储⽇期时间不如使⽤timestamp类型
对于关系型数据库⽽⾔,索引是相当重要的概念,请回答有关索引的⼏个问题:
a)、索引的⽬的是什么?
快速访问数据表中的特定信息,提⾼检索速度
创建唯⼀性索引,保证数据库表中每⼀⾏数据的唯⼀性。
加速表和表之间的连接
使⽤分组和排序⼦句进⾏数据检索时,可以显著减少查询中分组和排序的时间
b)、索引对数据库系统的负⾯影响是什么?
负⾯影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加⽽增加;索引需要占⽤物理空间,不光是表需要占⽤数据空间,每个索引也需要占⽤物理空间;当对表进⾏增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
c)、为数据表建⽴索引的原则有哪些?
在最频繁使⽤的、⽤以缩⼩查询范围的字段上建⽴索引。
在频繁使⽤的、需要排序的字段上建⽴索引
d)、什么情况下不宜建⽴索引?
对于查询中很少涉及的列或者重复值⽐较多的列,不宜建⽴索引。
对于⼀些特殊的数据类型,不宜建⽴索引,⽐如⽂本字段(text)等
简述在MySQL数据库中MyISAM和InnoDB的区别
区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,⽽不是数据库。
InnoDB与MyISAM的区别:
InnoDB存储引擎: 主要⾯向OLTP(Online Transaction Processing,在线事务处理)⽅⾯的应⽤,是第⼀个完整⽀持ACID事务的存储引擎(BDB第⼀个⽀持事务的存储引擎,已经停⽌开发)。
特点:
· ⾏锁设计、⽀持外键,⽀持事务,⽀持并发,锁粒度是⽀持mvcc得⾏级锁;
MyISAM存储引擎: 是MySQL官⽅提供的存储引擎,主要⾯向OLAP(Online Analytical Processing,在线分析处理)⽅⾯的应⽤。
特点:
不⽀持事务,锁粒度是⽀持并发插⼊得表级锁,⽀持表所和全⽂索引。操作速度快,不能读写操作太频繁;
解释MySQL外连接、内连接与⾃连接的区别
先说什么是交叉连接: 交叉连接⼜叫笛卡尔积,它是指不使⽤任何条件,直接将⼀个表的所有记录和另⼀个表中的所有记录⼀⼀匹配。
内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的⾏。
数据库原理实验一
外连接其结果集中不仅包含符合连接条件的⾏,⽽且还会包括左表、右表或两个表中
的所有数据⾏,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显⽰,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL⽬前还不⽀持全外连接。
写出三种以上MySQL数据库存储引擎的名称(提⽰:不区分⼤⼩写)
MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、
Archive、CSV、Blackhole、MaxDB 等等⼗⼏个引擎
Myql中的事务回滚机制概述
事务是⽤户定义的⼀个数据库操作序列,这些操作要么全做要么全不做,是⼀个不可分割的⼯作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中两个不同表时,如果它们不是⼀个事务的话,当第⼀个表修改完,可能第⼆个表修改过程中出现了异常⽽没能修改,此时就只有第⼆个表依旧是未修改之前的状态,⽽第⼀个表已经被修改完毕。⽽当你把它们设定为⼀个事务的时候,当第⼀个表修改完,第⼆表修改出现异常⽽没能修改,第⼀个表和第⼆个表都要回到未修改的状态,这就是所谓的事务回滚
SQL语⾔包括哪⼏部分?每部分都有哪些操作关键字?
答:SQL语⾔包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke
数据查询:select
完整性约束包括哪些?
答:数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:
1. 实体完整性:规定表的每⼀⾏在表中是惟⼀的实体。
2. 域完整性:是指表中的列必须满⾜某种特定的数据类型约束,其中约束⼜包括取值范围、精度等规定。
3. 参照完整性:是指两个表的主关键字和外关键字的数据应⼀致,保证了表之间的数据的⼀致性,防⽌了数据丢失或⽆意义的数据在数
据库中扩散。
4. ⽤户定义的完整性:不同的关系数据库系统根据其应⽤环境的不同,往往还需要⼀些特殊的约束条件。⽤户定义的完整性即是针对某
个特定关系数据库的约束条件,它反映某⼀具体应⽤必须满⾜的语义要求。
与表有关的约束:包括列约束(NOT NULL(⾮空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。
什么是事务?及其特性?
答:事务:是⼀系列的数据库操作,是数据库应⽤的基本逻辑单位。
事务特性:
(1)原⼦性:即不可分割性,事务要么全部被执⾏,要么就全部不被执⾏。
(2)⼀致性或可串性。事务的执⾏使得数据库从⼀种正确状态转换成另⼀种正确状态
(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
(4)持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
或者这样理解:
事务就是被绑定在⼀起作为⼀个逻辑⼯作单元的SQL语句分组,如果任何⼀个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执⾏,要么不执⾏,就可以使⽤事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原⼦性,⼀致性,隔离性和持久性。
什么是锁?
答:数据库是⼀个多⽤户使⽤的共享资源。当多个⽤户并发地存取数据时,在数据库中就会产⽣多个事务同时存取同⼀数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的⼀致性。
加锁是实现数据库并发控制的⼀个⾮常重要的技术。当事务在对某个数据对象进⾏操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了⼀定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进⾏更新操作。
基本锁类型:锁包括⾏级锁和表级锁
什么叫视图?游标是什么?
答:视图是⼀种虚拟的表,具有和物理表相同的功能。可以对视图进⾏增,改,查,操作,视图通常是有⼀个表或者多个表的⾏或列的⼦集。对视图的修改不影响基本表。它使得我们获取数据更容易,相⽐多表查询。
游标:是对查询出来的结果集作为⼀个单元来有效的处理。游标可以定在该单元中的特定⾏,从结果集的当前⾏检索⼀⾏或多⾏。可以对结果集当前⾏做修改。⼀般不使⽤游标,但是需要逐条处理数据的时候,游标显得⼗分重要。
什么是存储过程?⽤什么来调⽤?
答:存储过程是⼀个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建⼀次,以后在该程序中就可以调⽤多次。如果某次操作需要执⾏多次SQL,使⽤存储过程⽐单纯SQL语句执⾏要快。
可以⽤⼀个命令对象来调⽤存储过程。
索引的作⽤?和它的优点缺点是什么?
答:索引就⼀种特殊的查询表,数据库的搜索引擎可以利⽤它加速对数据的检索。它很类似与现实⽣活中书的⽬录,不需要查询整本书内容就可以到想要的数据。索引可以是唯⼀的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录⼊的速度,同时也增加了数据库的尺⼨⼤⼩。
如何通俗地理解三个范式?
答:第⼀范式:1NF是对属性的原⼦性约束,要求属性具有原⼦性,不可再分解;
感性无功和容性无功的区别第⼆范式:2NF是对记录的惟⼀性约束,要求记录有惟⼀标识,即实体的惟⼀性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派⽣出来,它要求字段没有冗余。。
范式化设计优缺点:
优点:
可以尽量得减少数据冗余,使得更新快,体积⼩

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。