mysql sql优化实例1(force index使用)
今天和运维同学一块查找mysql慢查询日志,发现了如下一条sql:
SELECT sum(`android` + ios) total,pictureid,title,add_time FROM `juzi_access_statistic` LEFT JOIN juzi_news ON juzi_access_statistic.pictureid=juzi_news.id GROUP BY `pictureid` HAVING total >= 100000 AND pictureid >= 8092 AND title IS NOT NULL LIMIT 2;
该sql语句花费了 2.7s,那么总共多少条呢?
总共54万条记录,其实也不算太慢,但是我觉得应该有很大的优化空间。
一:先看一下表结构
CREATE TABLE `juzi_access_statistic` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pictureid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',
`date` date NOT NULL COMMENT '日期',
`ios` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '苹果app访问量',
`android` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '安卓app访问量',
PRIMARY KEY (`id`),
UNIQUE KEY `pictureid` (`date`,`pictureid`) USING BTREE,
KEY `indexpictureid` (`pictureid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘访问统计表’;
二: 查看一下执行计划
在这里我发现了问题:juzi_access_statistic表竟然是全表扫描,pictureid字段上存在索引,为什么没有使用上呢?
我个人觉得原因是:因为存在条件pictureid >= 8092 和 juzi_access_statistic.pictureid=juzi_news.id(等价传递),所以mysql觉得使用juzi_news表的主键id查询效率是最高的。
三:使用force index 优化
看到效果了吧:key字段显示使用到了pictureid字段的索引,但扫描的行没有减少,执行时间如下:
四:正确使用where
以上sql中的pictureid >= 8092 其实应该放到where子句中,以便过滤到更多的无用记录,修复后的执行计划如下:
效果也很明显:rows减少到不足10万,速度可想而知,见下图:
从开始的2.74s 优化到17ms, 优化了100倍
mysql sql优化实例1(force index使用)的更多相关文章
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- MySQL索引优化实例说明
下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下: [1] test_a 有主键但无索引 CREATE TABLE `test_a` ( `id` int(10) unsign ...
- MySQL SQL优化之in与range查询【转】
本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...
- 18.Mysql SQL优化
18.SQL优化18.1 优化SQL语句的一般步骤 18.1.1 通过show status命令了解各种SQL的执行频率show [session|global] status; -- 查看服务器状态 ...
- MySQL sql优化(摘抄自文档)
前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...
- Mysql SQL优化&执行计划
SQL优化准则 禁用select * 使用select count(*) 统计行数 尽量少运算 尽量避免全表扫描,如果可以,在过滤列建立索引 尽量避免在where子句对字段进行null判断 尽量避免在 ...
- mysql sql优化及注意事项
sql优化分析 通过slow_log等方式可以捕获慢查询sql,然后就是减少其对io和cpu的使用(不合理的索引.不必要的数据访问和排序)当我们面对具体的sql时,首先查看其执行计划A.看其是否使用索 ...
- MySQL SQL优化教程
转自:https://www.cnblogs.com/duanxz/archive/2013/02/01/2889413.html 一,查询SQL执行效率 通过show status命令了解各种SQL ...
- MySQL SQL优化
一.优化数据库的一般步骤: (A) 通过 show status 命令了解各种SQL的执行频率. (B) 定位执行效率较低的SQL语句,方法两种: 事后查询定位:慢查询日志:--log-slow-qu ...
随机推荐
- ASP.NET MVC 2.0 参考源码索引
http://www.projky.com/asp.netmvc/2.0/System/Web/Mvc/AcceptVerbsAttribute.cs.htmlhttp://www.projky.co ...
- vm的三种网络模式
Vm网卡的模式:网络地址转换模式(nat),仅主机(host-only),桥接模式(Brideged) VMware 的几个虚拟设备: ■ VMnet0:这是 VMware 用于虚拟桥接网络下的虚拟交 ...
- php推送
需求: 我想做个会员站内通知的功能.不想用以前的ajax查询,听说有个推技术.以下文章介绍的不错,来自转载, ============================================= ...
- 内网内使用https 和 使用http 建立连接的速度对比
文字版 使用https httpstat https://10.24.101.14/cwbase/web/Login.aspx --insecure Connected to HTTP/ OK Ser ...
- AlarmManager的使用
原文地址:http://www.cnblogs.com/kross/p/3643708.html AlarmManager可以设定一个规定的时间,或者重复从某一个时间开始,等间隔的做一个操作.可以用来 ...
- (暂时弃坑)ACM数论之旅15---置换群与Polya定理(我把标题看成poi了,poipoipoi(*≧▽≦)ツ)
(挖坑...) ////////////////////////////////////////////////// 暂时弃坑 开学了,有空再写....
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...
- BZOJ3240 NOI2013矩阵游戏(数论)
必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...
- django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...
- Access数据库通过ODBC导出到Oracle的两个小问题ora-24801\Ora-01401
问题描述:从access通过odbc导出到oracle出现 ora-24801 非法值 错误 与 Ora-01401 值过大的错误 问题分析:access里面的字段类型为“备注”,导入到ora ...