MySQL - 索引失效的情况有哪些?[汇总篇] - 以及合理使用建议

1.应用场景

主要学习掌握MySQL索引的使用场景以及使用条件限制.

帮助我们高效使用索引进行开发,开发高性能高可用程序.

2.学习/操作

1. 文档

MySQL 索引 - 学习/实践_william_n的博客-CSDN博客

MySQL 索引 - 选取索引[选错索引]_william_n的博客-CSDN博客_mysql选错索引

06丨数据库原理:为什么PrepareStatement性能更好更安全?-极客时间

2. 整理输出

关于索引

MySQL 索引 - 学习/实践_william_n的博客-CSDN博客

MySQL 索引 - 选取索引[选错索引]_william_n的博客-CSDN博客_mysql 索引选择

索引失效情况

这里按照单列索引与聚合索引来分类,实践说明!!

2.1 索引列使用MySQL内置函数,同时处于运算符左侧

验证

MySQL - 索引失效的情况有哪些?[汇总篇] - 以及合理使用建议_第1张图片

MySQL - 索引失效的情况有哪些?[汇总篇] - 以及合理使用建议_第2张图片

索引列与非索引列使用SQL内置函数的结果:

MySQL - 索引失效的情况有哪些?[汇总篇] - 以及合理使用建议_第3张图片

综上可知:

同时将将 > 换成 =, 执行计划也是相同的结果.

1.当函数的位置在比较运算符左侧,索引失效. 这里走的是全表扫描.

当出现在比较运算符右边的依然可以走索引.

2.也可以知道,SELECT * FROM test WHERE learn_index > 0 AND DATE(learn_date) < DATE(NOW()); 

查询效率是最好的,filtered为100.

更多: 07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?_william_n的博客-CSDN博客

存在的问题:

数据量太小,稍后扩充数据量~~~

2.2 隐式类型转换

06丨数据库原理:为什么PrepareStatement性能更好更安全?-极客时间 -- 见评论,文章也很精彩

隐式类型转换,比如数据库字段是varchar类型,创建的索引,但是使用的时候传入的是int类型,那么会走全表扫面;

实践

TBD

TBD. 聚合索引

TBD

后续补充

...

3.问题/补充

06丨数据库原理:为什么PrepareStatement性能更好更安全?-极客时间

1. 索引可以提高数据库的查询性能,那么是不是应该尽量多的使用索引呢?如果不是,为什么?你还了解哪些改善数据库访问性能的技巧方法?

您好,老师:
回答上述问题
1.创建多的索引,会占用更多磁盘空间。如果有一张很大的表,索引文件的大小可能达到操作系统允许的最大文件限制;
2.对于DML操作的时候,索引会降低他们的速度。因为MySQL不仅要把搞定的数据写入数据文件,而且它还要把这些改动写入索引文件;
改善数据库性能:
1.索引优化,选择合适的索引列,选择在where、group by、order by、on 从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引。
2.索引字段越小越好。【索引的字段类型,比如INT 类型占用4个字节,如果这个字段类型能满足你存储的需求,那么就不必给它设置成BIGNT 占用8个字节的字段。】
3.SQL语句的优化、数据表结构的优化。
    3.1:选择可存数据最小的数据类型,选择最合适的字段类型,进行数据的存储;
    3.2:数据量很大的一张表,应该考虑水平分表或垂直分表;
    3.3:尽量不要使用text字段,如果非要用,那么应考虑将它存放另一张表中;
4.数据库配置的优化:
    4.1:连接数的配置,因为大量的连接,不进行操作,那样也会占用内存。
    4.2:查询缓存的配置,但在MySQL 8.0就删除了此功能。
5.硬件的配置;
 额外加说一下,常见性能的问题:
1.条件字段函数的操作,给索引字段做了函数计算,就会破坏索引值,因此优化器就放弃了走树搜索能够;
2.隐式类型转换,比如数据库字段是varchar类型,创建的索引,但是使用的时候传入的是int类型,那么会走全表扫面;
3.隐式字符编码转换,如果join 两表的时候,两表的字符集不同,也不能用上索引;

4.参考

MySQL 索引 - 学习/实践_william_n的博客-CSDN博客  // MySQL 索引 - 学习/实践

MySQL 索引 - 选取索引[选错索引]_william_n的博客-CSDN博客_mysql 索引选择  // MySQL 索引 - 选取索引[选错索引]

后续补充

...

你可能感兴趣的:(数据库-DATABASE,MYSQL,MySQL,索引,失效)