优化前:
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中谓词使用date_format的优化的更多相关文章

  1. MySQL中的SQL的常见优化策略

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...

  2. mysql中的SQL_CACHE(性能更优化)

    mysql中的sql_cache是个容易忽视的地方,要 使用的话,必须先设置query_cache_size, 以及设置query_cache_type ,其中 query_cache_type 这个 ...

  3. 在MySQL中如何使用覆盖索引优化limit分页查询

    背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...

  4. MySQL中Index Condition Pushdown(ICP)优化

    在MySQL 5.6开始支持的一种根据索引进行查询的优化方式.之前的MySQL数据库版本不支持ICP,当进行索引查询是,首先根据索引来查找记录,然后在根据WHERE条件来过滤记录.在支持ICP后,My ...

  5. MySQL中关于OR条件的优化

    转载 MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并. 该特新主要应用于 ...

  6. MySQL中怎么将LIMIT分页优化?

     1.语法:       *** limit [offset,] rows       一般是用于select语句中用以从结果集中拿出特定的一部分数据.       offset是偏移量,表示我们现在 ...

  7. MySQL中的索引优化

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...

  8. MySQL中的索引简介

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...

  9. mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.

    一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...

随机推荐

  1. MySQL事务之-2

    在上一篇中我们提到了MySQL的事务特性,这一片主要讲述事务的实现. 事务的隔离性由锁来实现.原子性,一致性,持久性通过数据库的redo和undo log来实现. redo恢复提交事务修改页的操作,而 ...

  2. SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  3. QT+qtablewidget自定义表头【合并单元格】

    1.把下列文件放在工程中[已上传到我的文件中] 2.代码 auto *headview = new HHeadViewClass(Qt::Horizontal, ui.tableWidget); he ...

  4. Dubbo 只注册,只订阅

    只注册场景: 某一个服务,被注册中心的一些服务依赖,但是该服务不提供给消费者调用,这个时候使用只注册,注册到注册中心,注册中心内部服务可以调用该服务,但是消费者不可以.(这个服务是被调用方) 只订阅场 ...

  5. SDN原理 OpenFlow协议 -3

    问题4:流表匹配 OF1.1版本 这是OF1.1版本的操作,引入了多流表,1.0版本并没有多流表. 多流表的匹配称为 流水线处理:交换机从流表0开始查找,按照流表序号从小到大匹配. 每个包按照优先级去 ...

  6. Codeforces Round #275 (Div. 2) A,B,C,D

    A. Counterexample time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. ubuntu 14.04 (desktop amd 64) 查看配置参数

    硬盘型号 sudo hdparm -i /dev/sda |grep "Model"   硬盘数量大小 sudo fdisk -l |grep "Disk /dev/sd ...

  8. Java回顾之集合

    在这篇文章里,我们关注Java中的集合(Collection).集合是编程语言中基础的一部分,Java自JDK早期,就引入了Java Collection Framework.设计JCF的那个人,后来 ...

  9. UVA-10305 Ordering Tasks (拓扑排序)

    题目大意:给出n个点,m条关系,按关系的从小到大排序. 题目分析:拓扑排序的模板题,套模板. kahn算法: 伪代码: Kahn算法: 摘一段维基百科上关于Kahn算法的伪码描述: L← Empty ...

  10. PHP和JAVA整合开发的三个方案(六)

    php作为前端开发,java负责后台开发,这样取长补短的方案很适合现在web开发.现在PHP和JAVA整合开发比较好的方案只有3个:1.SOAP2.php-java-bridge3.Quercus Q ...