面试又给我问到MySQL索引【索引的使用策略及优化】「建议收藏」

面试又给我问到MySQL索引【索引的使用策略及优化】

大家好,又见面了,我是全栈君。

精选文章

2020最新版MySQL数据库面试题(一)

2020最新版MySQL数据库面试题(二)

MySQL 上亿大表优化实践

别怕!MySQL引起的CPU消耗过大,我有办法

MySQL的查询需要遍历几次B+树,理论上需要几次磁盘I/O?

五、索引的使用策略

什么时候要使用索引?

  • 主键自动建立唯一索引;

  • 经常作为查询条件在WHERE或者ORDER BY 语句中出现的列要建立索引;

  • 作为排序的列要建立索引;

  • 查询中与其他表关联的字段,外键关系建立索引

  • 高并发条件下倾向组合索引;

  • 用于聚合函数的列可以建立索引,例如使用了max(column_1)或者count(column_1)时的column_1就需要建立索引

什么时候不要使用索引?

  • 经常增删改的列不要建立索引;

  • 有大量重复的列不建立索引;

  • 表记录太少不要建立索引。只有当数据库里已经有了足够多的测试数据时,它的性能测试结果才有实际参考价值。如果在测试数据库里只有几百条数据记录,它们往往在执行完第一条查询命令之后就被全部加载到内存里,这将使后续的查询命令都执行得非常快–不管有没有使用索引。只有当数据库里的记录超过了1000条、数据总量也超过了MySQL服务器上的内存总量时,数据库的性能测试结果才有意义。

索引失效的情况:

  • 在组合索引中不能有列的值为NULL,如果有,那么这一列对组合索引就是无效的。

  • 在一个SELECT语句中,索引只能使用一次,如果在WHERE中使用了,那么在ORDER BY中就不要用了。

  • LIKE操作中,’%aaa%’不会使用索引,也就是索引会失效,但是‘aaa%’可以使用索引。

  • 在索引的列上使用表达式或者函数会使索引失效,例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。其它通配符同样,也就是说,在查询条件中使用正则表达式时,只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。

  • 在查询条件中使用不等于,包括<符号、>符号和!=会导致索引失效。特别的是如果对主键索引使用!=则不会使索引失效,如果对主键索引或者整数类型的索引使用<符号或者>符号不会使索引失效。(经erwkjrfhjwkdb同学提醒,不等于,包括<符号、>符号和!,如果占总记录的比例很小的话,也不会失效)

  • 在查询条件中使用IS NULL或者IS NOT NULL会导致索引失效。

  • 字符串不加单引号会导致索引失效。更准确的说是类型不一致会导致失效,比如字段email是字符串类型的,使用WHERE email=99999 则会导致失败,应该改为WHERE email=’99999’。

  • 在查询条件中使用OR连接多个条件会导致索引失效,除非OR链接的每个条件都加上索引,这时应该改为两次查询,然后用UNION ALL连接起来。

  • 如果排序的字段使用了索引,那么select的字段也要是索引字段,否则索引失效。特别的是如果排序的是主键索引则select * 也不会导致索引失效。

  • 尽量不要包括多列排序,如果一定要,最好为这队列构建组合索引;

六、索引的优化

1、最左前缀

索引的最左前缀和和B+Tree中的“最左前缀原理”有关,举例来说就是如果设置了组合索引<col1,col2,col3>那么以下3中情况可以使用索引:col1,<col1,col2>,<col1,col2,col3>,其它的列,比如<col2,col3>,<col1,col3>,col2,col3等等都是不能使用索引的。

根据最左前缀原则,我们一般把排序分组频率最高的列放在最左边,以此类推。

2、带索引的模糊查询优化

在上面已经提到,使用LIKE进行模糊查询的时候,’%aaa%’不会使用索引,也就是索引会失效。如果是这种情况,只能使用全文索引来进行优化(上文有讲到)。

3、为检索的条件构建全文索引,然后使用

SELECT * FROM tablename MATCH(index_colum) ANGAINST(‘word’);

4、使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

(完结)

面试又给我问到MySQL索引【索引的使用策略及优化】「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111725.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第五章:activiti流程分流判断,判断走不同的任务节点

    第五章:activiti流程分流判断,判断走不同的任务节点第五章:activiti流程分流判断,判断走不同的任务节点

    2022年4月23日
  • voliate理解

    voliate理解voliatevoliate定义java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM…

    2022年6月5日
  • pycharm30天试用到期_手机软件试用期到了如何继续使用

    pycharm30天试用到期_手机软件试用期到了如何继续使用关注Python联盟,下载永久补丁激活补丁下载地址:添加链接描述提取码:rkuf根据使用前必看文档中内容步骤操作即可。感谢Python联盟

    2022年10月26日
  • 拥有你是我一生的追求

    拥有你是我一生的追求

    2021年8月10日
  • Jenkins使用教程

    Jenkins使用教程Jenkins是一款流行的开源持续集成(ContinuousIntegration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。本文以CentOS7环境为例,总结了Jenkins的安装与配置、邮件功能使用,并接入阿里巴巴的著名开源项目fastjson,以此演示Java项目(SVN+Maven)中FindBugs/CheckStyle/PMD等常用插件的使用、单元…

    2022年5月15日
  • 常见MQTT服务器搭建

    常见MQTT服务器搭建简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽、不可靠的网络的进行远程传感器和控制设备通讯等,正在日益成为物联网通信协议的重要组成部分。MQTT现在主要用于即时通讯,物联网M2M,物联网采集等。本文就社区上常见的开源MQTT服务器在常见操作系统上的搭建做详细介绍。目前一些开源MQTT服…

    2022年6月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号