Mysql存储引擎:
Mysql有两种存储引擎:MyISAM和InnoDB
MyISAM:
MyISAM 引擎是 MySQL 5.1 及之前版本的默认引擎,它的特点是:
(1)不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁
(2)不支持事务
(3)不支持外键
(4)不支持崩溃后的安全恢复
(5)在表有读取查询的同时,支持往表中插入新纪录
(6)支持 BLOB 和 TEXT 的前500个字符索引,支持全文索引
(7)支持延迟更新索引,极大提升写入性能
(8)对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用
InnoDB:
InnoDB 在 MySQL 5.5 及以后成为默认索引,它的特点是:
支持行锁,采用 MVCC 来支持高并发
支持事务
支持外键
支持崩溃后的安全恢复
不支持全文索引
InnoDB场景:
InnoDB 是一个事务型存储引擎,为用户操作非常大的数据存储提供了一个强大的解决方案,已经被很多互联网公司使用。
在以下场合下,使用InnoDB是最理想的选择:
更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。
事务:InnoDB 存储引擎是支持事务的标准MySQL存储引擎。
自动灾难恢复:与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
外键约束:MySQL支持外键的存储引擎只有InnoDB。
支持自动增加列 AUTO_INCREMENT 属性。
Mysql索引
mysql的索引分为单列索引(全文索引,主键索引,唯一索引,普通索引)和组合索引。
单列索引:一个索引只包含一个列,一个表可以有多个单列索引。
组合索引:一个组合索引包含两个或两个以上的列,
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并(最左前缀:意思是必须包括最左边的列索引
举个例子:(假设现在有组合索引(a,b,c),查询语句就只能是a=1或a=1and b=1或a=1 and b=1 and c=1。这里有两点需要注意
①a=1 and b=1和b=1 and a=1一样,没有区别,都会使用索引
②组合索引(a,b,c)的最左前缀是a;组合索引(c,b,a)的最左前缀是c,最左前缀和表字段顺序无关
)
全文索引:对文本的内容进行分词,进行搜索
索引失效
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,
又想让索引生效,只能将or条件中的每个列都加上索引
2.使用查询的时候遵循mysql组合索引的"最左前缀"规则,假设现在有组合索引(a,b,c),查询语句就只能是a=1
或a=1and b=1或a=1 and b=1 and c=1。这里有两点需要注意①a=1 and b=1和b=1 and a=1一样,没有区别,都会
使用索引②组合索引(a,b,c)的最左前缀是a;组合索引(c,b,a)的 最左前缀是c,最左前缀和表字段顺序无
关在组合索引中,如果where查询条件中某个列使用了范围查询(不管%在哪),则其右边的所有列都无法使用
索引优化查询
3.like查询以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
6.对索引列运算,运算包括(+、-、*、/、!、<>、%、like'%_'(%放在前面)、or、in、exist等),导致索引失效