前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sql性能优化--Explain命令后续之USE INDEX

Sql性能优化--Explain命令后续之USE INDEX

作者头像
风柏杨4711
发布2021-03-15 10:55:12
4050
发布2021-03-15 10:55:12
举报
文章被收录于专栏:技术小牛技术小牛

为什么mysql数据库查询加了索引的字段仍然很慢?

最近在开发一个推广渠道自行查询订单的功能,因为几年下来,平台的订单量也有百万级别了,发现虽然在用渠道ID字段查询时,虽然渠道ID加了索引,但仍然需要13秒左右才能拿到查询结果,我的订单表结构如下(下面只列出了跟本主题相关的列):

id(主键)

channelId(渠道id,索引列)

createTime(创建时间,索引列)

,我的SQL是这样的:

SELECT id,channelid,createTime FROM order WHERE channelId=’1’ ORDER BY createTime DESC LIMIT 20

我的感觉以现有数据库服务器的配置,这个数据量应该不至于这么慢的,于是用Explain命令分析了一下,结果如下图:

id

table

Type

Possibole_keys

key

Extra

1

Order

Index

channelId

createTime

Using where

Mysql是用了createTime作为查询的索引,跟预想的情况不大一样,分析了一下原因,可能是Mysql默认认为排序列索引的优先级比条件里的高吧,又或者因为createTime字段值本身更分散一些,所以Mysql优先使用了这列作为查询索引。

从这个场景可以看出实际上任何一下数据库的查询分析器都不是万能的,虽然本身它们在算法上都有做了优化,会尝试去找到最佳的筛选方式,但不是所有的情况下都管用,程序员必须带着辩证的思维方式去看待,遇到问题时要认真分析而不是盲目地相信数据库一定会做出最好的选择。因为索引的目的是为了快速缩小查找范围,但在这条SQL里,创建时间仅用来排序,是它来做索引是无法快速缩小范围的,而用渠道id来做索引则能迅速地缩小范围,所以尝试使用了USE INDEX(channelId)方法指定使用索引,果然查询速度有了20倍的提升(由原来的13.45秒提升到0.58秒),SQL性能优化确实是无止境的,永远都有提升空间。

附上加了USE INDEX指令的SQL:

SELECT id,channelid,createTime FROM order USE INDEX(channelId) WHERE channelId=’1’ ORDER BY createTime DESC LIMIT 20

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么mysql数据库查询加了索引的字段仍然很慢?
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档