优化前:
SELECT a.* FROM t1 a,
(SELECT obj_id,MAX(PRE_DETAIL_INST_ID) PRE_DETAIL_INST_ID FROM t1 WHERE DATE_FORMAT(crt_date,'%Y-%m-%d %H') < DATE_FORMAT(NOW(),'%Y-%m-%d %H') AND
DATE_FORMAT(crt_date,'%Y-%m-%d %H') >= DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 HOUR),'%Y-%m-%d %H') GROUP BY obj_id) b
WHERE a.pre_detail_inst_id = b.pre_detail_inst_id;
索引字段:
+---------------------+------------+---------------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------------+------------+---------------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t1| 0 | PRIMARY | 1 | PRE_DETAIL_INST_ID | A | 14897 | NULL | NULL | | BTREE | | |
| t1| 1 | PRE_INST_OBJ_ID_xxx | 1 | OBJ_ID | A | 14897 | NULL | NULL | YES | BTREE | | |
| t1| 1 | PRE_INST_PRE_INST_ID_xxx | 1 | PRE_INST_ID | A | 14897 | NULL | NULL | YES | BTREE | | |
| t1| 1 | pre_inst_pre_rule_id_xxx | 1 | PRE_RULE_ID | A | 1354 | NULL | NULL | YES | BTREE | | |
| t1| 1 | idx_bil_cust_order_id_xxx | 1 | CUST_ORDER_ID | A | 1489 | NULL | NULL | YES | BTREE | | |
| t1| 1 | idx_crt_date | 1 | CRT_DATE | A | 1354 | NULL | NULL | YES | BTREE | | |
+---------------------+------------+---------------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
执行计划如下:
+----+-------------+---------------------+--------+---------------------+---------------------+---------+----------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+--------+---------------------+---------------------+---------+----------------------+-------+-------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 14897 | Using where |
| 1 | PRIMARY | a | eq_ref | PRIMARY | PRIMARY | 8 | b.PRE_DETAIL_INST_ID | 1 | NULL |
| 2 | DERIVED | tb_bil_pre_inst_xxx | index | PRE_INST_OBJ_ID_xxx | PRE_INST_OBJ_ID_xxx | 9 | NULL | 14897 | Using where |
+----+-------------+---------------------+--------+---------------------+---------------------+---------+----------------------+-------+-------------+
对谓词crt_date加date_format函数无法使用索引。从而导致使用全表扫描。由于是innodb引擎,且无法使用索引导致行锁升级为表锁,在高并发环境下,导致大量的等待。
数据量: 2500000
执行时间:00:00:16:274
优化后:
SELECT a.* FROM
(SELECT * FROM t1 WHERE crt_date >= CONCAT(DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 HOUR),'%Y-%m-%d %H'),':00:00')
AND crt_date < CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d %H'),':00:00')) a,
(SELECT obj_id,MAX(pre_detail_inst_id) pre_detail_inst_id FROM t1 WHERE crt_date >= CONCAT(DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 HOUR),'%Y-%m-%d %H'),':00:00')
AND crt_date < CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d %H'),':00:00') GROUP BY obj_id) b
WHERE a.pre_detail_inst_id = b.pre_detail_inst_id;
执行计划如下:
+----+-------------+---------------------+-------+--------------------------------------+------------------+---------+----------------------+------+--------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+-------+--------------------------------------+------------------+---------+----------------------+------+--------------------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | NULL |
| 1 | PRIMARY | <derived3> | ref | <auto_key0> | <auto_key0> | 9 | a.PRE_DETAIL_INST_ID | 2 | NULL |
| 3 | DERIVED | t1| range | PRE_INST_OBJ_ID_xxx ,idx_crt_date_xxx | idx_crt_date_xxx | 6 | NULL | 1 | Using index condition; Using temporary; Using filesort |
| 2 | DERIVED | t1| range | idx_crt_date_xxx | idx_crt_date_xxx | 6 | NULL | 1 | Using index condition |
+----+-------------+---------------------+-------+--------------------------------------+------------------+---------+----------------------+------+--------------------------------------------------------+
改进crt_date,mysql使用索引范围查找,利用行锁,规避了表锁和高并发下的表锁等待问题。
数据量: 2500000
执行时间:00:00:00:188
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
- mysql中的SQL_CACHE(性能更优化)
mysql中的sql_cache是个容易忽视的地方,要 使用的话,必须先设置query_cache_size, 以及设置query_cache_type ,其中 query_cache_type 这个 ...
- 在MySQL中如何使用覆盖索引优化limit分页查询
背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...
- MySQL中Index Condition Pushdown(ICP)优化
在MySQL 5.6开始支持的一种根据索引进行查询的优化方式.之前的MySQL数据库版本不支持ICP,当进行索引查询是,首先根据索引来查找记录,然后在根据WHERE条件来过滤记录.在支持ICP后,My ...
- MySQL中关于OR条件的优化
转载 MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并. 该特新主要应用于 ...
- MySQL中怎么将LIMIT分页优化?
1.语法: *** limit [offset,] rows 一般是用于select语句中用以从结果集中拿出特定的一部分数据. offset是偏移量,表示我们现在 ...
- MySQL中的索引优化
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...
- MySQL中的索引简介
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...
随机推荐
- Django:提交表单时遇到403错误:CSRF verification failed
Django:提交表单时遇到403错误:CSRF verification failed 问题: 提交表单时遇到403错误:CSRF verification failed 解决方案: 在表单界面ht ...
- 关于Drupal中使用hook_schema建立数据库报错PDOException: SQLSTATE[42000]的解决办法
报错信息如下:PDOException: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too l ...
- HDU 6342 Expression in Memories(模拟)多校题解
题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...
- HDU 2544 最短路(最短路&Floyd)题解
思路:Floyd模板题,注意一下Floyd核心的三个循环,顺序不要变,我们不能把k放在最内层.因为Floyd是通过不断遍历查找是否有更小的两个路径拼起来能比当前小,如果k在最内层,那么我们就会提前算好 ...
- hdu 6301 Distinct Values(贪心)题解
题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ...
- 如何在官网下载JDK(版本、系统类型、字节位等)
JDK官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 步骤1: 此步注意不要下载运行时jre
- fiddler几种功能强大的用法(一)
参考网址: http://caibaojian.com/fiddler.html http://www.cnblogs.com/tangdongchu/p/4178552.html 1.fiddler ...
- Solidity 官方文档中文版 1_简介
简介 Solidity是一种语法类似JavaScript的高级语言.它被设计成以编译的方式生成以太坊虚拟机代码.在后续内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...
- 带宽检测工具iftop
1.安装 # yum install iftop –y 2.使用 # iftop -i eth0 -n # iftop -i eth0 -P 说明: 中间的<= =>这两个左右箭头,表示的 ...
- Curious Array CodeForces - 407C (高阶差分)
高阶差分板子题 const int N = 1e5+111; int a[N], n, m, k; int C[N][111], d[N][111]; signed main() { scanf(&q ...