数千行を含むテーブルがあり、数値を含むVarchar列があります。この列が数値型ではない理由について説明したにもかかわらず、そのテーブルから行を選択すると、奇妙な動作が見られました。
その列にはインデックスがありますが、数値文字列を使用して行を検索する方が、Int(0.54秒)を使用するよりもはるかに高速(0.01秒)です。これの理由は何ですか?インデックスの値をキャストして使用できないようです...
私は何かを見落としていますか?インデックスに使用するためにIntをキャストしていないようです。インデックスの使用法に関するヒントを提供する必要がありますか、それともこれを実現するためのデータベーススイッチがありますか?または、Explainの出力を誤解した場合、なぜそれがそれほど遅くなるのですか?
例を示すテーブルレイアウト:
CREATE TABLE `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stuff` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_stuff` (`stuff`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ここでは、インデックスに文字列を使用しています。
explain select * from example where stuff='200';
----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
| 1 | SIMPLE | example | ref | idx_stuff | idx_stuff | 137 | const | 1 | Using where; Using index |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
ここでは、インデックスの検索に使用する文字列にIntをキャストしていないようです。
explain select * from example where stuff=200;
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+
| 1 | SIMPLE | example | index | idx_stuff | idx_stuff | 137 | NULL | 2 | Using where; Using index |
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+