| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL索引失效场景 -> 正文阅读 |
|
[大数据]MySQL索引失效场景 |
1. 全值匹配索引如有索引 index_id 对应索引字段为 id,和索引index_id_name对应索引字段为id 和 name,这时条件中使用了id和name,如 where id=1 and name=‘zs’ 时, 索引 index_id 失效。即条件中有多个字段时,优先考虑匹配条件中的组合索引。 2. 最左匹配原则MySQL中最多可建立16个索引,当使用组合索引时,需要注意索引匹配是从最左的索引字段开始,若跳过某一个字段,后面的索引字段全失效。
注意1,2,3,5 的条件的索引条件字段都匹配了,因为条件语句中出现的条件字段在符合组合索引中从左到右。 这里的匹配原因,需要知道MySQL索引底层数据结构,深究原因可以参考文章 InnoDB中索引的推演 4. 主键插入顺序以InnoDB存储引擎为例,所有数据基于主键去存储,主键储存在数据页中会以从小到大的顺序存储,如果插入的表的主键值不是递增的,数据页自身存在大小,以一个数据页存放100条数据为例,当主键值非递增添加时,会导致数据在各个数据页因为排序去移动,即导致大量的也分裂,这个是非常消耗性能的,建议主键以自增方式储存。 5. 计算、函数、类型转换当条件中使用计算如加,减之类 where id+1=1000,或者使用函数如 where SUBSTRING(name)=‘zs’,或者类型转换如id为int类型,条件使用字符串 where id = ‘100’ 这些情况都会导致索引失效。 6. 范围条件右边的列索引失效如一张表仅有一个索引且为组合索引,字段排序为 id,name,age,address 7. 不等于(!= 或 <>)索引失效如where id !=1 或 where id <> 1 这种情况 id 无法匹配到索引。 8. is null 可以使用索引,is not null 无法使用索引,not like 无法使用索引针对这种情况,建议在设计数据表时将字段设置为NOT NULL约束,如INT类型字段,可以默认值设置为0。 9. like 以通配符%开头索引失效如条件1:where name like ‘%zs%’ 10. or 前后存在非索引列,索引失效如有一张表仅有一个索引 index_age,查询条件为 where age = 20 or name = ‘zs’,这时无法匹配到索引。如果在针对name字段建一个索引 index_name,这个查询条件便可以匹配到索引。 11. 数据库和表的字符集统一使用utf8mb4统一使用uft8mb4兼容性比较好,统一字符集可以避免由于字符集转换产生的乱码,也可以避免不同的字符集进行比较前需要进行转换导致索引失效。 问题
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年7日历 | -2025/7/2 6:55:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |