1.各个数据库存储引擎区别
mysql的存储引擎是针对表进行设置的,一个库的不同表可以设置不同的存储引擎, mysql默认支持多种存储引擎,以适用不同领域的数据库应用需要,主要的几个数据库引 擎如下:
1.MyISAM存储引擎 5.5之前默认的存储引擎,不支持事务、不支持外键,表级锁,内存和硬盘空间占用率低,其优势是访问速度快,对事务完整性没有要求,以select、insert为主的应用基本上都可以使用这个引擎;
2. InnoDB存储引擎 5.5之后默认的存储引擎,提供了具有提交、回滚和奔溃恢复能力的事务安全,支持外键并提供了行级锁,其劣势在于写的处理效率相对较低,并且会占用更多的磁盘空间以保留数据和索引;
3. MEMORY存储引擎使用存于内存中的内容来创建表,MEMORY类型的表数据存于内存访问非常的快,默 认使用HASH索引,一旦数据库服务重启或关闭,表中的数据就会丢失;
4. MERGE存储引擎 MERGE存储引擎是一组MyISAM表组合,这些MyISAM表结构完全相同。MERGE表 本身没有数据,对MERGE表的CRUD操作都是通过内部的MyISAM表进行的;
2.提高sql语句效率的技巧
1.大批量插入数据
大批量数据插入空表,可将表设置成为MyISAM,并通过disable keys将唯一索引 关闭; 大批量数据插入非空Innodb表,
可采取如下措施提高效率:
1. 导入数据时按照主键顺序排列;
2. 导入数据前使用set UNIQUE_CHECKS=0,关闭唯一性校验,导入后恢复;
3. 如果使用了自动提交,建议在导入前执行SET AUTOCOMMIT=0,关闭自动 提交,导入后恢复。
2.优化INSERT语句
1. 尽量使用多个值表的insert语句,降低连接、关闭的消耗;
2. 将索引文件和数据文件分在不同的磁盘上存放;
3. 从一个文本文件装入一个表时,使用LOAD DATA INFLIE ,比一般的insert语句快 20倍;
3.查询优化
1.尽量减少额外的排序,通过索引直接返回有序数据;where条件和order by使用相同的索引,并且order by的顺序与索引顺序相同,并且order by的字段都是升序或 者都是降序;
2.尽量只选择必要的字段,提高sql性能;
3.能用关联查询的不要用子查询;
4.对于包含or的查询语句,如果要利用索引,则or之间的每个条件都必须用到索引, 否则应该考虑增加索引;
5.优化分页
在索引上完成排序分页的操作,然后根据主键关联回原表查询所需的其他列
把limit查询转换为某个位置的查询;
4.不使用索引的情况
1.如果MySQL估计使用索引比全表扫描更慢,则不使用索引。
2.用or分隔开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到;
3.复合索引,如果索引列不是复合索引的第一部分,则不使用索引(即不符合最左前缀);
4.如果like是以’%’开始的,则该列上的索引不会被使用;
5. 如果列为字符串,则where条件中必须将字符常量值加引号,否则即使该列上存在 索引,也不会被使用;
6. not in 、 not exists 、 (<> 不等于 !=)这些操作符不走索引 ;
7. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系 统将可能无法正确使用索引;
3.怎么样做执行计划分析
通过explain命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表 如何连接和连接的顺序;explain分析后的结果解析:
select_type
查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询
SIMPLE:简单的select查询,查询中不包含子查询或者union
PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
SUBQUERY:在select 或 where列表中包含了子查询
UNION:若第二个select出现在union之后,则被标记为union;若union包含在from 子句的子查询中,外层select将被标记为derived
type
访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是: system > const > eq_ref > ref > range > index > ALL
一般来说,好的sql查询至少达到range级别,最好能达到ref;
system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现, 可以忽略不计
const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配(1对1);
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
range:索引范围扫描;
index:索引全扫描;
ALL:全表扫描;
possible_keys 查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用
key 实际使用的索引,如果为NULL,则没有使用索引。
key_len 表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实 际使用长度,理论上长度越短越好;
ref 显示索引的哪些列;
rows 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
Extra 不适合在其他字段中显示,但是十分重要的额外信息
4.优化目标
- 根据需求建立索引
- 每个查询都要使用索引以提高查询效率,至少达到range级别,最好能达到ref;
- 追求key_len和rows最小。
5.mysql复制的原理
1.主库在数据提交时会把数据变更作为事件记录在二进制日志文件Binlog中;可通过
sync_binlog控制binlog日志刷新到磁盘的频率;
2.主库推送二进制日志文件binlog中的事件到从库的中继日志Relay Log,之后从库
根据中继日志RelayLog重做数据变更操作,通过逻辑复制达到主从库的数据一致;
3.MySQL通过3个线程来完成主从库之间的数据同步,其中binlog dump线程跑在主
库上,I/O线程和sql线程跑在从库上。
当从库启动复制时,首先创建I/O线程连接主库,主库随后创建binlog dump线程读 取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志 replay log中去,之后从库上的sql线程读取中继日志中更新的数据库事件并应用;