注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MySQL反定律添加索引优化SQL

MySQL SQL 彭东稳 5911次浏览 已收录 0个评论

大家有听到过在为表建立索引的时候一定不能在选择性(selective)低的字段上建立索引吧,比如(性别、类型、状态等等)。

我们的应用就有类似以下一张表:

其中status是有0,1这两个值:

  • 0:代表数据是从别地同步过来的数据,但是我们未经过处理。
  • 1:说明我们已经处理过的数据。

在几次无意中的show processlist总是能看到有这样的语句在Sending data:

好奇的小看了一下发现这个表的数据还挺多。自己在开发库执行了一下,执行的好久。最后和开发了解了一下,他们说这是一个排程,每5分钟一次,经过更深入的了解,知道他们要操作的数据其实只是status=0的,而在在5分钟之内接收的数据和总数据相比简直是小巫见老巫了。

于是就在开发库添加一下索引。发现效果真是杠杠的。

下面是一系列演示:

创建测试表

添加数据

生成几条status=0的数据

没有键索引时的速度

创建索引

查看创建索引后的速度

经过测试完了,我们会发现,表建立索引的时候一定不能在选择性(selective)低的字段上建立索引吧,比如(性别、类型、状态等等)这个原则还是需要遵守的,我们这个查询被加索引后查询变快主要是因为status=0返回数据量太小,从某种程度来说,如果针对这个索引只有这么一条查询的话,它不算是低选择的字段。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!