索引是什么
通过 show profile for query 1;
可以查看该查询语句执行的整个过程,则我们就能分析出那部分是需要优化的
索引是帮助Mysql高效获取数据的数据结构
索引存储在文件系统中
索引的文件存储形式与存储引擎有关
索引文件的结构
hash 范围查找不方便
二叉树 深度过深,造成io次数变长
B树
B+树
Mysql用B+树
用InnoDB引擎 用B+树建立索引的规则
1、当用主键创建索引时(有主键时mysql会自动会主键创建索引),叶子节点直接存储记录,如果没有主键则选择唯一键,如果没有唯一键则会生成6位的row_id来作为主键
2、当用其他字段创建索引时,会进行两次B+的寻找,第一次B+树叶子节点存放的是该记录的主键,然后通过找到的主键再去另一个B+树中寻找,这个B+的叶子节点存放的就是记录了。
用MyISAM引擎 用B+树建立索引的规则
B+树的叶子节点存储的是磁盘地址,找到后需要访存一次找到记录
通过索引进行调优
索引的基本知识
1、大大减少了服务器需要扫描的数据量
2、帮助服务器避免排序和临时表
3、将随机IO变成顺序IO
索引的用处
加快我们的数据访问
回表
就是用不是主键的列建立了普通索引,普通索引的b+树的叶子节点存储的不是记录,而是主键的值,这时候就需要回表,回到由主键建立的B+树,这是叶子节点才是存储的记录。
覆盖索引
就是当用普通索引查找时,且只查找id(主键),则不用回表一次即可查到
select * from table1 where name='zhangsan'
select id from table1 where name='zhangsan'(此时就是覆盖索引)
最左匹配
在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
索引下推
只有组合索引时,才有下推
例如 where 关于 name 和 age
正常按最左匹配,先找到符合name的数据放入到mysql的server层中
再到server层按照age进行数据过滤
下推后
直接从存储引擎拉去数据的时候直接按照name和age做判断,符合的结果返回给mysqlserver
哈希索引
用链表法的那个就是哈希表,只有memory的存储引擎显示支持哈希索引
聚簇索引 与 非聚簇索引
聚簇索引(InoDB是聚簇)就是数据文件跟索引文件紧凑在一起存放,
而非聚簇索引则相反
优化小细节(重点)
1、当使用索引进行查询时,尽量不要用表达式,计算应发到业务层而不是数据库层
2、尽量使用主键查询而不是其他索引,主键索引不会回表
3、使用索引来排序
4、union all in or 推荐使用in
5、范围列可以用到索引
6、强制类型转换会全表扫描
7、更新频繁,区分度不高的字段不建议当作索引
8、能使用limit就用limit
9、连表查询最好不超过3个