经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL中索引的优化的示例详解
来源:jb51  时间:2023/2/20 15:16:33  对本文有异议

使用索引优化

索引是数据库优化最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题。

数据准备

  1. use world;
  2. create table tb_seller(
  3. sellerid varchar(100),
  4. name varchar(100),
  5. nickname varchar(50),
  6. password varchar(60),
  7. status varchar(1),
  8. address varchar(100),
  9. createtime datetime,
  10. primary key(sellerid)
  11. );
  12. insert into tb_seller values('alibaba','阿里巴巴','阿里小店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  13. ('baidu','百度科技有限公司','百度小店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  14. ('huawei','华为科技有限公司','华为小店','e10adc3949ba59abbe057f20f883e','0','北京市','2088-01-01 12:00:00'),
  15. ('itcast','传智播客教育科技有限公司','传智播客','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  16. ('itheima','黑马程序员','黑马程序员','e10adc3949ba59abbe057f20f883e','0','北京市','2088-01-01 12:00:00'),
  17. ('luoji','罗技科技有限公司','罗技小店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  18. ('oppo','oppo科技有限公司','oppo官方旗舰店','e10adc3949ba59abbe057f20f883e','0','北京市','2088-01-01 12:00:00'),
  19. ('ourpalm','掌趣科技股份有限公司','掌趣小店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  20. ('qiandu','千度科技','千度小店','e10adc3949ba59abbe057f20f883e','2','北京市','2088-01-01 12:00:00'),
  21. ('sina','新浪科技有限公司','新浪官方旗舰店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00'),
  22. ('xiaomi','小米科技','小米官方旗舰店','e10adc3949ba59abbe057f20f883e','1','西安市','2088-01-01 12:00:00'),
  23. ('yijia','宜家家居','宜家官方旗舰店','e10adc3949ba59abbe057f20f883e','1','北京市','2088-01-01 12:00:00');
  24. -- 创建组合索引
  25. create index index_seller_name_sta_addr on tb_seller(name,status,address);

避免索引失效应用-全值匹配

该情况下,索引生效,执行效率高。

  1. -- 避免索引失效应用-全值匹配
  2. -- 全值匹配,和字段匹配成功即可,和字段顺序无关
  3. explain select * from tb_seller ts where name ='小米科技' and status ='1' and address ='北京市';
  4. explain select * from tb_seller ts where status ='1' and name ='小米科技' and address ='北京市';

避免索引失效应用-最左前缀法则

该情况下,索引生效,执行效率高。

  1. -- 避免索引失效应用-最左前缀法则
  2. -- 如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始,并且不跳过索引中的列
  3. explain select * from tb_seller ts where name='小米科技';-- key_lem:403
  4. explain select * from tb_seller ts where name='小米科技' and status ='1';-- key_lem:410
  5. explain select * from tb_seller ts where status ='1' and name='小米科技' ;-- key_lem:410,依然跟顺序无关
  6. -- 违反最左前缀法则,索引失效
  7. explain select * from tb_seller ts where status ='1';-- 违反最左前缀法则,索引失效
  8. -- 如果符合最左前缀法则,但是出现跳跃某一列,只有最左列索引生效
  9. explain select * from tb_seller where name='小米科技' and address='北京市';-- key_lem:403

避免索引失效应用-其他匹配原则

该情况下,索引生效,执行效率高。

1、情况一

  1. -- 避免索引失效应用-其他匹配原则
  2. -- 范围查询右边的列,不能使用索引
  3. explain select * from tb_seller where name= '小米科技' and status >'1' and address='北京市';-- key_lem:410,没有使用status这个索引
  4. -- 不要在索引列上进行运算操作,索引将失效。
  5. explain select * from tb_seller where substring(name,3,2) ='科技';-- 没有使用索引
  6. -- 字符串不加单引号,造成索引失效。
  7. explain select * from tb_seller where name='小米科技' and status = 1 ;-- key_lem:403,没有使用status这个索引

2、 情况二

explain中的extra列

extra含义
using filesort说明mysq|会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,称为“文件排序" ,效率低。
using  temporary需要建立临时表(temporary table)来暂存中间结果,常见于order by和group by;效率低
using  indexSQL所需要返回的所有列数据均在一棵索引树上,避免访问表的数据行,效率不错
using where在查找使用索引的情况下,需要回表去查询所需的数据
using index condition查找使用了索引,但是需要回表查询数据
using index;using where查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

但是再加有个password

 3、情况三

4、情况四

5、 如果MySQL评估使用索引比全表更慢,则不使用索引。is NULL , is NOT NULL有时有效,有时索引失效。in走索引,not in索引失效。单列索引和复合索引,尽量使用符合索引

验证

创建了单一的三个索引,最后面where全使用了但explain显示只用了index_name

到此这篇关于MySQL中索引的优化的示例详解的文章就介绍到这了,更多相关MySQL索引优化内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号