MySQL 索引的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | create index idx_item_title on tb_item(title); 环境准备 create table `tb_seller` ( `sellerid` varchar (100), ` name ` varchar (100), `nickname` varchar (50), ` password ` varchar (60), `status` varchar (1), `address` varchar (100), `createtime` datetime, primary key (`sellerid`) )engine=innodb default charset=utf8mb4; insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'alibaba' , '阿里巴巴' , '阿里小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'baidu' , '百度科技有限公司' , '百度小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'huawei' , '华为科技有限公司' , '华为小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '0' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'itcast' , '传智播客教育科技有限公司' , '传智播 客' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'itheima' , '黑马程序员' , '黑马程序 员' , 'e10adc3949ba59abbe56e057f20f883e' , '0' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'luoji' , '罗技科技有限公司' , '罗技小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'oppo' , 'OPPO科技有限公司' , 'OPPO官方旗舰 店' , 'e10adc3949ba59abbe56e057f20f883e' , '0' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'ourpalm' , '掌趣科技股份有限公司' , '掌趣小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'qiandu' , '千度科技' , '千度小 店' , 'e10adc3949ba59abbe56e057f20f883e' , '2' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'sina' , '新浪科技有限公司' , '新浪官方旗舰 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'xiaomi' , '小米科技' , '小米官方旗舰 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '西安市' , '2088-01-01 12:00:00' ); insert into `tb_seller` (`sellerid`, ` name `, `nickname`, ` password `, `status`, `address`, `createtime`) values ( 'yijia' , '宜家家居' , '宜家家居旗舰 店' , 'e10adc3949ba59abbe56e057f20f883e' , '1' , '北京市' , '2088-01-01 12:00:00' ); create index idx_seller_name_sta_addr on tb_seller( name ,status,address); 避免索引失效: 1)全职匹配 对索引中所有列都指定具体的值 explain select * from tb_seller where name = '小米科技' and status= '1' and address= '北京 市' \G; 2)最左前缀法则:指的是查询从索引的最左前列开始,并且不跳过索引中的列 3). 范围查询右边的列,不能使用索引 。 4). 不要在索引列上进行运算操作, 索引将失效。 5). 字符串不加单引号,造成索引失效。 6). 尽量使用覆盖索引,避免 select * 尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少 select * 。 7). 用 or 分割开的条件, 如果 or 前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。 8). 以%开头的 Like 模糊查询,索引失效。 9). 如果MySQL评估使用索引比全表更慢,则不使用索引。 10). is NULL , is NOT NULL 有时索引失效。 11). in 走索引, not in 索引失效。 12). 单列索引和复合索引。 尽量使用复合索引,而少使用单列索引 。 create index idx_name_sta_address on tb_seller( name , status, address); 就相当于创建了三个索引 : name name + status name + status + address 创建单列索引 create index idx_seller_name on tb_seller( name ); create index idx_seller_status on tb_seller(status); create index idx_seller_address on tb_seller(address); 数据库会选择一个最优的索引(辨识度最高索引)来使用,并不会使用全部索引 查看索引使用情况 show status like 'Handler_read%' ; show global status like 'Handler_read%' ; Handler_read_first:索引中第一条被读的次数。如果较高,表示服务器正执行大量全索引扫描(这个值越低 越好)。 Handler_read_key:如果索引正在工作,这个值代表一个行被索引值读的次数,如果值越低,表示索引得到的 性能改善不高,因为索引不经常使用(这个值越高越好)。 Handler_read_next :按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列, 该值增加。 Handler_read_prev:按照键顺序读前一行的请求数。该读方法主要用于优化 ORDER BY ... DESC 。 Handler_read_rnd :根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。 你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键。这个值较高,意味着运行效率低,应 该建立索引来补救。 Handler_read_rnd_next:在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说 明你的表索引不正确或写入的查询没有利用索引。 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2020-08-18 Python 中psutil 模块的安装