诡异的MySql执行计划的更改
2013-03-23 23:45
375 查看
SQL是在从库上执行
正常的执行计划:
explain SELECT h.id hid,r.rate rate FROM ORDER_CUST_INFO o, exchange_rate r, HOTEL_INFO h where o.group_id = h.group_id and o.currency = r.type and r.type != 'CNY' and h.type = 'OWNER' and h.apply_status = 'CHECKED' and h.online = true and h.online_status = true and h.deleted = false ;
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
| 1 | SIMPLE | r | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 1 | SIMPLE | o | ALL | FK_OCI_GID | NULL | NULL | NULL | 18476 | Using where; Using join buffer |
| 1 | SIMPLE | h | ref | idx_group_id | idx_group_id | 5 | hms.o.GROUP_ID | 1 | Using where |
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
3 rows in set (0.00 sec)
在定时备份时,从库的执行计划变更
mysql> explain SELECT h.id hid,r.rate rate FROM ORDER_CUST_INFO o, exchange_rate r, HOTEL_INFO h where o.group_id = h.group_id and o.currency = r.type and r.type != 'CNY' and h.type = 'OWNER' and h.apply_status = 'CHECKED' and h.online = true and h.online_status = true and h.deleted = false ;
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
| 1 | SIMPLE | r | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 1 | SIMPLE | h | ALL | idx_group_id | NULL | NULL | NULL | 68935 | Using where; Using join buffer |
| 1 | SIMPLE | o | eq_ref | FK_OCI_GID | FK_OCI_GID | 4 | hms.h.group_id | 1 | Using where |
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
3 rows in set (0.00 sec)
是在想不到好办法,只能强制表的扫描顺序:
正常的执行计划:
explain SELECT h.id hid,r.rate rate FROM ORDER_CUST_INFO o, exchange_rate r, HOTEL_INFO h where o.group_id = h.group_id and o.currency = r.type and r.type != 'CNY' and h.type = 'OWNER' and h.apply_status = 'CHECKED' and h.online = true and h.online_status = true and h.deleted = false ;
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
| 1 | SIMPLE | r | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 1 | SIMPLE | o | ALL | FK_OCI_GID | NULL | NULL | NULL | 18476 | Using where; Using join buffer |
| 1 | SIMPLE | h | ref | idx_group_id | idx_group_id | 5 | hms.o.GROUP_ID | 1 | Using where |
+----+-------------+-------+------+---------------+--------------+---------+----------------+-------+--------------------------------+
3 rows in set (0.00 sec)
在定时备份时,从库的执行计划变更
mysql> explain SELECT h.id hid,r.rate rate FROM ORDER_CUST_INFO o, exchange_rate r, HOTEL_INFO h where o.group_id = h.group_id and o.currency = r.type and r.type != 'CNY' and h.type = 'OWNER' and h.apply_status = 'CHECKED' and h.online = true and h.online_status = true and h.deleted = false ;
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
| 1 | SIMPLE | r | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 1 | SIMPLE | h | ALL | idx_group_id | NULL | NULL | NULL | 68935 | Using where; Using join buffer |
| 1 | SIMPLE | o | eq_ref | FK_OCI_GID | FK_OCI_GID | 4 | hms.h.group_id | 1 | Using where |
+----+-------------+-------+--------+---------------+------------+---------+----------------+-------+--------------------------------+
3 rows in set (0.00 sec)
是在想不到好办法,只能强制表的扫描顺序:
SELECT h.id hid, r.rate rate FROM exchange_rate r STRAIGHT_JOIN ORDER_CUST_INFO o ON o.CURRENCY = r.TYPE STRAIGHT_JOIN HOTEL_INFO h ON h.group_id = o.GROUP_ID WHERE o.group_id = h.group_id AND o.currency = r.TYPE AND r.TYPE != 'CNY' AND h.TYPE = 'OWNER' AND h.apply_status = 'CHECKED' AND h.online = TRUE AND h.online_status = TRUE AND h.deleted = FALSE ;
相关文章推荐
- MySQL中使用explain和profile分析SQL执行计划和性能
- mysql执行计划看必会(explain讲解)
- mysql 执行计划解读
- SQL优化系列-mysql执行计划
- MySQL执行计划解读
- Mysql执行计划详解
- mysql innodb 如何获取用于 生成执行计划的 数据表统计信息
- 怎么去看懂mysql的执行计划
- Mysql 执行计划分析举例
- MySQL执行计划解读
- mysql定时计划任务,ON COMPLETION [NOT] PRESERVE 当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而声明PRESERVE的作用是使事件在执行完毕后不会被Drop掉
- MySQL高级开发(四)---索引优化分析(MySQL执行计划解析)
- mysql计划任务(轮询执行脚本)
- MySQL执行计划解读
- MySQL执行计划解读
- MySQL执行计划显示与执行过程不符合一例
- MySQL自动化运维之用mysqldump和mysqlbinlog实现某一数据库的每周全备和每天差异备份,并添加到执行计划【热备】
- MySQL执行计划解读
- MySQL执行计划各列含义
- MySQL EXPLAIN 命令: 查看查询执行计划