首页 / MYSQL / MySQL调优4---索引
MySQL调优4---索引
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL调优4---索引,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3957字,纯文字阅读大概需要6分钟。
内容图文
如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分类
1.PRIMARY KEY 主键索引:一个表只能有一个主键,不允许有空值。
2.UNIQUE INDEX 唯一索引:索引列的值必须唯一,但允许有空值。
3.INDEX 普通索引:最基本的索引,它没有任何限制
4.FULLTEXT 全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
5.INDEX 组合索引:多个字段上创建的索引
索引的作用
1.快速查找,减少服务器需要扫描的数据量
2.减少IO操作,避免临时表
索引的数据结构
1.Memory存储引擎使用哈希表。
优点:快,在内存中。缺点:不能持久化,重启没有了。
2.Mylsam和InnoDB使用B+树
优点:
1.B+树每个叶子节点可以包含更多的节点(相比于二叉树,平衡二叉树,红黑树等),既降低了树的高度,又将数据范围变为多个区间,加快了检索速度。
2.非叶子节点仅存储key值(B树非叶子节点也存储数据),叶子节点存储key值和数据(Mylsam存储引擎存储的是数据文件的地址)。
3.叶子节点两两之间指针连接,顺序查询性能更高。
聚簇索引和非聚簇索引
聚簇索引
数据和相邻的键值存储在一起;访问速度更快,在同一个树中;使用覆盖索引查询可以直接取出数值。
非聚簇索引
数据文件跟索引文件分开存放,先查询到索引,再去对应的文件位置查询数据
索引监控
show status like 'Handler_read%';
Handler_read_first:读取索引第一个条目的次数
Handler_read_key:通过index获取数据的次数
Handler_read_last:读取索引最后一个条目的次数
Handler_read_next:通过索引读取下一条数据的次数
Handler_read_prev:通过索引读取上一条数据的次数
Handler_read_rnd:从固定位置读取数据的次数
Handler_read_rnd_next:从数据节点读取下一条数据的次数
数值越大,说明索引利用率更高
索引使用注意事项
1.回表
主键查询不会触发回表,其他索引会触发回表。
因为innodb的主键索引树叶子结点上保存的是全行数据,主键查询可以一次定位到数据的行数,取出数据内容;
而其他索引需要两次查询,第一次查询到主键值,再根据主键值查询出对应的数据。
2.覆盖索引
explain的输出结果Extra字段为Using index时,能够触发索引覆盖。只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
3.索引覆盖
将需要查询的结果字段建立组合索引
能够一次取出索要查询的结果字段,不需要回表
4.最左匹配
索引查询从最左边开始匹配
组合索引需要考虑索引的顺序和分组的合理性,如下,建立a、b、c三个索引,查询结果如表所示
5.前缀索引
在一个很长的字符串上建立索引,选取长度过长会消耗太多的内存,让索引查询效率变慢,所以需要选择一个合适的长度。
可以截取字符串的前几位和总数做对比,取出一个合适的长度。
前缀索引是一种能使索引更小更快的有效方法,但是也包含缺点:mysql无法使用前缀索引做order by 和 group by。
6.索引下推
mysql默认启用索引下推,我们也可以通过修改系统变量optimizer_switch的index_condition_pushdown标志来控制
SET optimizer_switch = 'index_condition_pushdown=off';
索引下推适合INNODB引擎的二级索引。即第一次用第一级索引取出符合条件的部分数据,然后第二级别索引继续过滤条件查询,最终结果再回表根据主键查询。如下SQL:
现有student表建有组合索引(name,score),要求查询分数在90分以上且姓赵的同学。
SELECT *FROM student WHERE name LIKE '赵%' AND score>90;
先查询出姓赵的同学,然后根据分数过滤拿到主键id,根据主键id回表查询
Like:匹配模式必须要左边确定不能以通配符开头
7.union all,in,or都能够使用索引,但是推荐使用in
必须要保证 OR 两端的条件都存在可以用的索引,该查询才可以使用索引
8.范围列可以用到索引,但是范围列后面的列无法用到索引,索引最多用于一个范围列,范围条件是:<、<=、>、>=、between
9.强制类型转换会全表扫描
本来有一个字符串的字段建立了索引,查询的时候字符串后面匹配一个整型值,会导致全表扫描。
oracle数据库类型不匹配会报错
10.阿里规范,join表最好不超过三张,非要使用在关联条件上创建索引
11.更新频繁的字段不是和建索引,索引维护消耗资源,增删改都会重新更新索引。更新索引时会有页分裂和合并等IO操作。
一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算
12.合理使用索引,并不是越多越好。
单表索引建议控制在5个以内
单索引字段数不允许超过5个(组合索引)
能使用limit的时候尽量使用limit
MySQL调优4---索引
标签:sele 利用 默认 对比 sql primary 存储引擎 包含 访问
本文系统来源:https://www.cnblogs.com/farmersun/p/12490140.html
内容总结
以上是互联网集市为您收集整理的MySQL调优4---索引全部内容,希望文章能够帮你解决MySQL调优4---索引所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。