mysql--大数据表order by + limit 导致查询缓慢问题
问题描述:数据表有3000万行,单表分页查询,count时间在10s内,limit查询需要一分钟左右;表的索引非常多,几乎每写一个sql都会创建对应的索引,
sql类似:
select [data] from [table] where [condition] order by [sort] limit ?
尽管数据量很大,但也很慢的离谱了。查阅资料加上自己的尝试,发现sql慢的原因是mysql优化器默认选择了sort字段的索引,这个字段是个时间戳,区分度比较小,所以查询就会很慢。
跟业务沟通,他们坚持不允许修改排序的字段。好吧,那只能尝试改别的了。
第一种改法:给sql增加建议索引。一般情况下,加了建议索引,mysql就会走建议的索引,而不是自己去选择。
select [data] from [table] use index(idx) where [condition] order by [sort] limit ?
当然也可以强制sql走建议的索引:
select [data] from [table] force index(idx) where [condition] order by [sort] limit ?
确实有效的加快了查询速度。
但没过几天,又有一家客户反馈慢,经常,也是选择了慢的单字段的索引。出于其他客户的查询并不慢的考虑,只想给出问题的客户查询sql中指定索引,避免其他新的问题出现,但一家又一家也不是办法啊。。。
第二种改法:
select [data] from [table] ignore index(idx) where [condition] order by [sort] limit ?
既然这个sort索引非常慢,那我们将这个慢索引删除掉,mysql不就只能选择其他索引了么。。尝试去删除索引,在阿里云安全执行的加持下,删了半个小时,还是失败了。。体量太大,已经不允许增加索引或删除索引了。
又想到,既然可以建议索引,那也应该可以禁止索引吧?
确实可以禁用索引,ignore index().禁止了慢的索引,跟删除了索引是一个效果。加上一劳永逸
结论:
建索引的时候一定要慎重,区分度不大的字段不要建单索引,sql每次执行的时候只能走一个索引,不要给他太多选择。。选择题总会出错的
有启发的博文:
选择了错误的慢索引:https://blog.csdn.net/weixin_39592315/article/details/113214658
索引命中规则:https://blog.csdn.net/weixin_40139740/article/details/84959075
优化sql:https://blog.csdn.net/qq_34412668/article/details/107962985
优化sql:https://blog.csdn.net/shengang1978/article/details/78595306
原文地址:https://www.cnblogs.com/shaoph/p/15393317.html
- 概率论10 方差与标准差
- MySQL优化原理
- Python深入06 Python的内存管理
- 微信登陆代码
- HTML语义化:HTML5的新标签及IE5.5~9的部分兼容方案
- TCP/IP(八)之总结TCP/IP四层模型
- 在Orchard中使用Image Gallery模块
- CentOS7设置IP地址
- 服务器端Javascript
- ASP连接数据库
- 彻底隐藏你HTML网页的源代码
- java学习:JMM(java memory model)、volatile、synchronized、AtomicXXX理解
- 使用CSS制作文字环绕图片效果(文字内容包含<li>标签)
- ClojureScript魔法堂:搭建开发环境
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 浅谈keras中Dropout在预测过程中是否仍要起作用
- 浅谈keras中loss与val_loss的关系
- python中tkinter窗口位置坐标大小等实现示例
- python os模块在系统管理中的应用
- Laravel路由研究之domain解决多域名问题的方法示例
- python GUI模拟实现计算器
- 详解php命令注入攻击
- PHP设计模式之策略模式原理与用法实例分析
- python使用QQ邮箱实现自动发送邮件
- php使用lua+redis实现限流,计数器模式,令牌桶模式
- PHP whois查询类定义与用法示例
- Laravel多域名下字段验证的方法
- ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
- 简单了解如何封装自己的Python包
- python求解汉诺塔游戏