Mysql提升索引效率优化的八种方法总结

 更新时间:2024年04月16日 10:32:51   作者:it技术分享just_free  
索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的,这篇文章主要给大家介绍了关于Mysql提升索引效率优化的八种方法,需要的朋友可以参考下

前言

索引的设计可以遵循一些已有的原则,创建索引的时候应尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。本节将介绍一些索引的设计原则。

1. 选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

2. 为经常需要排序、分组和联合操作的字段建立索引

经常需要 ORDER BY、GROUP BY、DISTINCT 和 UNION 等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。

3. 为常作为查询条件的字段建立索引

如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。

注意:常查询条件的字段不一定是所要选择的列,换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。

4. 限制索引的数目

索引的数目不是“越多越好”。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。在修改表的内容时,索引必须进行更新,有时还可能需要重构。因此,索引越多,更新表的时间就越长。

如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。此外,MySQL 在生成一个执行计划时,要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使 MySQL 选择不到所要使用的最佳索引。

5. 尽量使用数据量少的索引

如果索引的值很长,那么查询的速度会受到影响。例如,对一个 CHAR(100) 类型的字段进行全文检索需要的时间肯定要比对 CHAR(10) 类型的字段需要的时间要多。

6. 数据量小的表最好不要使用索引

由于数据较小,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

7. 尽量使用前缀来索引

如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT 和 BLOG 类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

8. 删除不再使用或者很少使用的索引

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。应该定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

9. 索引最好设置为 NOT NULL:

索引列存在 NULL 就会导致优化器在做索引选择的时候更加复杂,更加难以优化,因为可为 NULL 的列会使索引、索引统计和值比较都更复杂,比如进行索引统计时,count 会省略值为NULL 的行。

NULL 值是一个没意义的值,但是它会占用物理空间,所以会带来的存储空间的问题,因为 InnoDB 存储记录的时候,如果表中存在允许为 NULL 的字段,那么行格式 中至少会用 1 字节空间存储 NULL 值列表。

10. 防止索引失效:

我们设置了索引并不意味着一定会用上索引,再某些情况下索引也会失效。

  • 当我们使用左或者左右模糊匹配的时候,也就是 Link %x 或者 Link %x% 这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果在 or 前的条件列是索引列,而在 or 后的条件列不是索引列,那么索引会失效。

总结

选择索引的最终目的是为了使查询的速度变快,上面给出的原则是最基本的准则,但不能只拘泥于上面的准则。应该在学习和工作中不断的实践,根据应用的实际情况进行分析和判断,选择最合适的索引方式。

相关文章

  • mysql索引基数概念与用法示例

    mysql索引基数概念与用法示例

    这篇文章主要介绍了mysql索引基数概念与用法,结合实例形式分析了mysql索引基数的相关概念、原理、操作命令及相关使用技巧,需要的朋友可以参考下
    2019-03-03
  • 解析MySQL中INSERT INTO SELECT的使用

    解析MySQL中INSERT INTO SELECT的使用

    本篇文章是对MySQL中INSERT INTO SELECT的使用进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • 全面了解MySql中的事务

    全面了解MySql中的事务

    下面小编就为大家带来一篇全面了解MySql中的事务。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • SQL FOREIGN KEY约束保障表之间关系完整性关键规则详解

    SQL FOREIGN KEY约束保障表之间关系完整性关键规则详解

    这篇文章主要介绍了SQL FOREIGN KEY约束保障表之间关系完整性关键规则详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • MySQL笔记之运算符使用详解

    MySQL笔记之运算符使用详解

    运算符包括四类,分别是:算数运算符、比较运算符、逻辑运算符和位运算符
    2013-05-05
  • Navicat连接MySQL出现2059错误的解决方案

    Navicat连接MySQL出现2059错误的解决方案

    当使用Navicat连接MySQL时,如果出现错误代码2059,表示MySQL服务器不接受Navicat提供的加密插件,解决方法主要有两种:一是修改MySQL用户的认证插件为mysql_native_password,二是升级Navicat到最新版本以支持MySQL8.0及其默认的caching_sha2_password认证插件
    2024-10-10
  • MySQL中MVCC机制的实现原理

    MySQL中MVCC机制的实现原理

    这篇文章主要介绍了MySQL中MVCC机制的实现原理,MVCC多版本并发控制,MySQL中一种并发控制的方法,他主要是为了提高数据库的读写性能,用更好的方式去处理读写冲突
    2022-08-08
  • mysql命令行爱好者必备工具mycli

    mysql命令行爱好者必备工具mycli

    这篇文章主要介绍了mysql命令行爱好者必备工具mycli的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • 深入理解MySQL双字段分区(OVER(PARTITION BY A,B)

    深入理解MySQL双字段分区(OVER(PARTITION BY A,B)

    本文主要介绍了MySQL中的窗口函数双字段分区功能(OVER(PARTITION BY A,B),分析其在数据分组和性能优化中的应用,提高查询效率,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • 详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题

    详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题

    这篇文章主要介绍了DBeaver连接MySQL8以上版本以及解决可能遇到的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论