dtabaseエンジンは「InnoDB」であるため、
デフォルトでInnoDBのすべてのユーザーデータは、Bツリーインデックスを含むページに保存されます。
B-tree are good for following lookups:
● Exact full value (= xxx)
● Range of values (BETWEEN xx AND yy)
● Column prefix (LIKE 'xx%')
● Leftmost prefix
したがって、クエリでは、インデックスなどを使用して最適化するのではなく、クエリを高速化することを考えることができます。
カバーリングインデックスを作成することで、クエリを高速化できます。
カバーリングインデックスとはall fields selected in a query are covered by an index
、、その場合はInnoDB(MyISAMではない)will never read the data in the table, but only use the data in the index
の場合を指しsignificantly speeding up the select
ます。InnoDBでは、主キーはすべてのセカンダリインデックスに含まれているため、ある意味ですべてのセカンダリインデックスは複合インデックスであることに注意してください。これは、InnoDBで次のクエリを実行した場合を意味します。
SELECT `moduleName` ,`menuName`
FROM `Modules1`
WHERE 'abc_def' LIKE(CONCAT(`moduleName`,'%'))
MySQL will always use a covering index and will not access the actual table
To believe, go to **Explain**
What does Explain statement mean?
table:
出力が影響を受けるテーブルを示します。
type:
使用されている結合のタイプを示します。最良から最悪まで、タイプは次のとおりです。system、const、eq_ref、ref、range、index、all
possible_keys:
このテーブルの行を見つけるためにMySQLが選択できるインデックスを示します
key:
MySQLが実際に使用することを決定したキー(インデックス)を示します。MySQLがpossible_keysインデックスの1つを使用して行を検索することを決定した場合、そのインデックスがキー値としてリストされます。
key_len:
使用するキーの長さです。短いほど良いです。
ref:
使用される列(または定数)
rows:
MySQLがクエリを実行するために調べる必要があると考える行数。
extra Extra info:
ここで見るのが悪いのは「一時的なものを使う」と「ファイルソートを使う」です
1,990行ありました。
私の実験:
where句にはIsernのソリューションをお勧めします
case 1) no indexes
explain select `moduleName` ,`menuName` FROM `Modules1` WHERE moduleName = SUBSTRING('abc_def', 1, LENGTH(moduleName));
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Modules | ALL | NULL | NULL | NULL | NULL | 2156 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
カバーインデックスを作成する方法
case 2) ALTER TABLE `test`.`Modules1` ADD index `mod_name` (`moduleName`)
explain select `moduleName` ,`menuName` FROM `Modules1` WHERE moduleName = SUBSTRING('abc_def', 1, LENGTH(moduleName));
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Modules | ALL | NULL | NULL | NULL | NULL | 2156 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
ここでは、使用されているインデックスを示しています。列を参照してください:キー、エクストラ
case 3) ALTER TABLE `test`.`Modules1` DROP INDEX `mod_name` ,
ADD INDEX `mod_name` ( `moduleName` , `menuName` )
explain select `moduleName` ,`menuName` FROM `Modules1` WHERE moduleName = SUBSTRING('abc_def', 1, LENGTH(moduleName));
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
| 1 | SIMPLE | Modules | index | NULL | mod_name | 1069 | NULL | 2066 | Using where; Using index |
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
case 4) ALTER TABLE `test`.`Modules1` DROP INDEX `mod_name` ,
ADD INDEX `mod_name` ( `ID` , `moduleName` , `menuName` )
explain select `moduleName` ,`menuName` FROM `Modules1` WHERE moduleName = SUBSTRING('abc_def', 1, LENGTH(moduleName));
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
| 1 | SIMPLE | Modules | index | NULL | mod_name | 1073 | NULL | 2061 | Using where; Using index |
+----+-------------+----------+-------+---------------+----------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
編集:
use where moduleName regexp "^(a|ab|abc|abc_|abc_d|abc_de|abc_def)$";
in place of substring()