表示される実行計画は実際と一致せず、速度が非常に遅い.
4925 ワード
今日は問題があります.explainは実行計画を見ても大丈夫ですが、実行速度が遅いので、まず問題を見てみましょう.
説明の下の環境、centos 6.5 32 Gメモリテーブルデータ量8億余り
実行計画から見れば問題なく、index 09はソートを回避し、特にこのsqlに適しており、理論はこんなに遅くはならない.データベースが本当に実行されているのはindex 09ではないのではないかと疑っている.
強制的にindex 09を使用すると、ミリ秒レベルのリターン結果が発見され、データベースが実際にindex 09を使用していないことが判明する.
説明の下の環境、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)