表示される実行計画は実際と一致せず、速度が非常に遅い.

4925 ワード

今日は問題があります.explainは実行計画を見ても大丈夫ですが、実行速度が遅いので、まず問題を見てみましょう.
説明の下の環境、centos 6.5 32 Gメモリテーブルデータ量8億余り
mysql> explain select * from sjkk_gcjl where jgsj>='2010-01-20 00:00:00' AND  jgsj<='2015-05-20 00:00:00'  and hpys = '2' and csys='A' ORDER BY jgsj DESC,jlbh DESc;
+----+-------------+-----------+------+---------------------------------+---------+---------+-------------+---------+-------------+
| id | select_type | table     | type | possible_keys                   | key     | key_len | ref         | rows    | Extra       |
+----+-------------+-----------+------+---------------------------------+---------+---------+-------------+---------+-------------+
|  1 | SIMPLE      | sjkk_gcjl | ref  | index08,index09,index10,index11 | index09 | 22      | const,const | 4875345 | Using where |
+----+-------------+-----------+------+---------------------------------+---------+---------+-------------+---------+-------------+
 select * from sjkk_gcjl where jgsj>='2010-01-20 00:00:00' AND  jgsj<='2015-05-20 00:00:00'  and hpys = '2' and csys='A' ORDER BY jgsj DESC,jlbh DESc;
 ......
 100 rows in set (6min 36sec)
KEY `index09` (`csys`,`hpys`,`jgsj`,`jlbh`);
実行計画から見れば問題なく、index 09はソートを回避し、特にこのsqlに適しており、理論はこんなに遅くはならない.データベースが本当に実行されているのはindex 09ではないのではないかと疑っている.
強制的にindex 09を使用すると、ミリ秒レベルのリターン結果が発見され、データベースが実際にindex 09を使用していないことが判明する.
select * from sjkk_gcjl force index(index09) where jgsj>='2010-01-20 00:00:00' AND  jgsj<='2015-05-20 00:00:00'  and hpys = '2' and csys='A' 
ORDER BY jgsj DESC,jlbh DESC;
.....
100 rows in set (0.00 sec)
 
  

, Cardinality NULl。

mysql> show index from sjkk_gcjl;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| sjkk_gcjl |          1 | index09  |            1 | csys        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            2 | hpys        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            3 | jgsj        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            4 | jlbh        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
.....


を める.
analyze table sjkk_gcjl;
+-------------------------+---------+----------+----------+
| Table                   | Op      | Msg_type | Msg_text |
+-------------------------+---------+----------+----------+
| changzhou_9yi.sjkk_gcjl | analyze | status   | OK       |
+-------------------------+---------+----------+----------+
1 row in set (1 hour 7 min 55.56 sec)


インデックスの を します.
mysql> show index from sjkk_gcjl;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| sjkk_gcjl |          1 | index09  |            1 | csys        | A         |          56 |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            2 | hpys        | A         |         224 |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            3 | jgsj        | A         |   199409376 |     NULL | NULL   |      | BTREE      |         |               |
| sjkk_gcjl |          1 | index09  |            4 | jlbh        | A         |   797637506 |     NULL | NULL   |      | BTREE      |         |               |
......


すると、ミリ レベルで が されます.
select * from sjkk_gcjl  where jgsj>='2010-01-20 00:00:00' AND  jgsj<='2015-05-20 00:00:00'  and hpys='2' and csys='A' ORDER BY jgsj DESC,jlbh DESC LIMIT 100;
....
100 rows in set (0.00 sec)