インデックスを活かせないSQL文の書き方
インデックスを設定した列のデータを対象に関数を適用した場合
mysql> EXPLAIN SELECT id,ndate FROM t_hanbai WHERE DATE_FORMAT(ndate,'%Y/m')='20 0507'; +----------+-------+---------------+-------+---------+------+------+------------ --------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+-------+---------------+-------+---------+------+------+------------ --------------+ | t_hanbai | index | NULL | ndate | 3 | NULL | 9 | Using where ; Using index | +----------+-------+---------------+-------+---------+------+------+------------ --------------+ 1 row in set (0.02 sec)
DATE_FORMAT関数が返す値をすべて比較をしているから
以下のように指定しないとインデックスを活用できない。
mysql> EXPLAIN SELECT id,ndate FROM t_hanbai WHERE ndate>='2005-07-01' AND ndate <'2005-08-01'; +----------+-------+---------------+-------+---------+------+------+------------ --------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+-------+---------------+-------+---------+------+------+------------ --------------+ | t_hanbai | range | ndate | ndate | 3 | NULL | 4 | Using where ; Using index | +----------+-------+---------------+-------+---------+------+------+------------ --------------+ 1 row in set (0.00 sec)
暗黙のデータ型変換が発生する
mysql> EXPLAIN SELECT * FROM t_hanbai WHERE kkbun = 1; +----------+------+---------------+------+---------+------+------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+------+---------+------+------+-------------+ | t_hanbai | ALL | kkbun | NULL | NULL | NULL | 9 | Using where | +----------+------+---------------+------+---------+------+------+-------------+ 1 row in set (0.01 sec) mysql> EXPLAIN SELECT * FROM t_hanbai WHERE kkbun = '1'; +----------+------+---------------+-------+---------+-------+------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+-------+---------+-------+------+-------------+ | t_hanbai | ref | kkbun | kkbun | 1 | const | 3 | Using where | +----------+------+---------------+-------+---------+-------+------+-------------+ 1 row in set (0.00 sec)
kkbun列はchar型なので、WHERE kkbun = '1'という具合にシングルクォートを使う必要がある
指定した条件に当てはまらない「not equal」なレコードを探す場合
mysql> EXPLAIN SELECT * FROM t_hanbai WHERE kkbun != '1'; +----------+------+---------------+------+---------+------+------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+------+---------+------+------+-------------+ | t_hanbai | ALL | NULL | NULL | NULL | NULL | 9 | Using where | +----------+------+---------------+------+---------+------+------+-------------+ 1 row in set (0.01 sec)