mysql存储引擎,主流存储引擎有两种,主要区别
1.MyISAM:表操作性能高,但不支持事务,InnoDB支持事务,mysql5.5以后默认的存储引擎
2.MyISAM索引结构为B-TREE,InnoDB索引结构为B+TREE
3.MyISAM索引文件和数据文件分离,InnoDB数据文件本身为B+TREE结构
注:关于InnoDB使用B+TREE而不用红黑树。因为红黑树内存操作,不适合过大的数据量操作
索引结构类型:
B-TREE:
1.树上所有节点元素不重复,每个节点都存储相应数据的引用。
2.数据从左到右递增,
3.叶子节点不存在指针
B+TREE
1.叶子节点存储数据,包含父节点索引。非叶子节点不存储数据,所以父节点可以存储更多索引
*注* mysql读取按页读取,每页16k,每个索引节点8Byte+6Byte指针,所以每页大概1000多条数据
2.叶子节点为链表结构。节点之间用指针连接,方便区间查询
3.必须有主键,并推荐使用整型自增主键。若表中未创建主键,则默认生成一列主键
4.若为二级索引,则叶子节点存储主键id。这样能保证一致性,并节省空间。
5.二级索引查询会有回表操作,所以若查询使用二级索引推荐使用覆盖索引,这样不会有回表操作,查询性能高
HASH:
查询快,仅支持等于查询
sql索引使用注意事项
1.使用全值匹配 。即使用有索引字段等于查询
2.最左前缀法则。即若索引为联合索引,使用的查询字段不可跳过索引中的列
3.不在索引列上做运算。如使用时间类型转换,left等运算,会导致索引失效
4.尽量使用覆盖索引,即使用select 字段 代替select * 使用
5.not in ,not exists , != ,is null , is not null无法使用索引
6.like操作开头模糊无法使用索引。即%xxx
7.若为字符串,不加‘’索引可能会失效
8.in查询有可能会使用到索引。在阿里规范中(泰山版)有写in查询不超过1000,性能影响不大
关于count(*) count(1) count(字段)
若字段有索引则性能差距不大,使用执行计划可查看