MySQL索引实战经验总结

MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验。

索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时,首先在索引中找到匹配的值,然后根据这个匹配值找到对应的数据行。

概念解释

聚簇索引

聚簇索引的顺序就是数据的物理存储顺序,索引中数据域存储的就是实际的数据,一个表最多只能有一个聚簇索引,适用于查询多行数据,不适用于频繁修改的列,一般在主键上创建。

非聚簇索引

索引顺序与数据物理排列顺序无关,索引中存储的内容为实际数据的地址,适应于查询单行数据。

普通索引

即平时创建的普通索引。

唯一索引

索引所在的列或列组合的值是全表唯一的。

全文索引

MySQL从3.23.23版开始支持全文索引,它查找的是文中的关键词,而不是直接比较索引中的值。

单列索引

在单列上创建的索引。

组合索引

在多个列上创建的索引。

最左前缀查找

where子句中有a、b、c三个查询条件,创建一个组合索引abc(a,b,c),最左前缀的概念是说以组合索引最左边的列a组合成的查询条件,如(a,b,c)、(a,b)、(a,c),这三种情况的查询条件都会使用abc索引,和where子句中a、b、c出现的顺序没关系,可以是where c=? and b=? and a=?,但(b,c)组合不会使用索引,即where c=? and b=?。

哪些列适合创建索引

  • 经常作为查询条件的列;
  • 经常作为排序条件的列;
  • 经常作为join条件的列;
  • 经常被查询的列;

哪些列不适合创建索引

  • 数据频繁被修改的列,数据被修改,索引需要做相应的修改,消耗资源;
  • 区分度不是很高的列,如性别,列值重复性太大,索引效果不是很明显;
  • 不是经常被作为查询条件、排序条件、连接条件的列。

经验总结

  • 列上进行函数计算将不会使用索引;
  • 对于创建索引的列,避免存储NULL,NULL会使索引更加复杂、效率变低,可以使用NOT NULL进行约束;
  • 对于模糊查询like '%abc%',将不会使用索引,而like 'abc%'将会使用索引;
  • 对于not in、not exists、!=等负向查询将不会使用索引;
  • 每次查询只使用一个索引,如果where条件使用了索引,order by将不再使用索引;
  • 对于where子句中有多个查询条件的,单列索引的效率不如复合索引,因为查询每次只能使用一个索引;
  • MySQL只对以下操作符才使用索引:<、<=、=、>、>=、between、in,但是需要注意in的范围值不要太多;
  • union all可以使用索引,但本身效率不是很高,不建议使用;
  • 列上进行类型转换的将不会使用索引;
  • 老版本MySQL对OR条件不使用索引,新版本才支持,不建议使用OR。

关于索引的实战经验总结后续还会不断更新。

本文分享自微信公众号 - JavaQ(Java-Q)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏电光石火

更新到mysql 5.7后解决0000-00-00日期问题

mysql 5.7 默认开始用以下sql mode : ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN...

362130
来自专栏Golang语言社区

48. 访问MySql数据库增删改查和连接池及空字段处理 | 厚土Go学习笔记

和上一节相比,go 语言访问 MySql 数据库可以有更好的写法,今天来讲一下连接池。同时,也演示一下当表字段内容为 NULL 时,go 语言的处理。 首先我们...

46180
来自专栏积累沉淀

低版本中mysql不支持在limit语句中有子查询

select * from  exec_activity_effect_day oe where oe.ACTIVITY_ID  in   (select  D...

440120
来自专栏听雨堂

MySql.Data.dll的版本

在.Net下访问Mysql,先是用6.4.4,老有问题,也不知道哪个版本可以用,查询官网 https://dev.mysql.com/doc/connector...

390110
来自专栏不想当开发的产品不是好测试

修改mysql的时间/时区

# 背景 往db中insert数据发现时间不对,因为是新DB,所以猜测是mysql设置不对 # 解决方法 方法一:通过mysql命令行模式下动态修改 show ...

588100
来自专栏圣杰的专栏

.NET Core+MySql+Nginx 容器化部署

1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容...

47480
来自专栏积累沉淀

MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded

Lock wait timeout exceeded 当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束; select *...

43280
来自专栏CaiRui

开启和查看mysql的bin-log日志

[root@VM_0_7_centos data]# vim /etc/my.cnf [root@VM_0_7_centos data]# vim /etc/...

42060
来自专栏CaiRui

Mysql的用户基本操作

创建用户: mysql> create user 'cai'@'localhost' identified by '123456'; Query OK, 0 r...

36560
来自专栏漏斗社区

工具| 诸神之眼nmap定制化之初识篇

Nmap是学习网络安全必备的一款工具,有着强大的信息收集能力,有本书甚至因此称它为“诸神之眼” 。Nmap不仅仅是一个端口扫描器那么简单,它还有着一个强大的脚本...

49380

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励