0

〜1.500.000レコードのテーブルがあります:

CREATE TABLE `item_locale` (
  `item_id` bigint(20) NOT NULL,
  `language` int(11) NOT NULL,
  `name` varchar(256) COLLATE utf8_czech_ci NOT NULL,
  `text` text COLLATE utf8_czech_ci)
  PRIMARY KEY (`item_id`,`language`),
  KEY `name` (`name`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

item_id、を主キーとして使用し、サイズ255languageでインデックスを作成します。name

次のクエリで:

select item_id, name from item_locale order by name limit 50;

必要な行は50行だけですが、選択には約3秒のイベントがかかります。

そのようなクエリを高速化するために何ができますか?

編集:あなたの何人かはインデックスを追加することを提案しました。前述したように、name列にはサイズ255のインデックスが付けられています。

explainは次のコマンドを実行しました:

+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows    | Extra          |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
|  1 | SIMPLE      | item_locale | ALL  | NULL          | NULL | NULL    | NULL | 1558653 | Using filesort |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+

不思議なことに、インデックスを使用していないようです...

4

4 に答える 4

1

50レコードの取得も重くなります。Order byも使用しているので、10個に制限してください。

于 2013-02-20T12:42:07.783 に答える
1

クエリヒントを使用してみてください。

select item_id, name 
 from item_locale USE INDEX FOR ORDER BY (name) 
  order by name limit 50;

また、使用してみてください

select item_id, name 
 from item_locale FORCE INDEX (name) 
  order by name limit 50;
于 2013-02-20T13:54:25.867 に答える
1

結局、インデックスにはある種の問題がありました。インデックスをすべて削除して、再度作成しました。そしてそれはついに機能します。ありがとう。

于 2013-02-27T05:08:40.237 に答える
0

名前フィールドにインデックスを適用すると、少しスピードアップする可能性があります。

于 2013-02-20T12:45:26.933 に答える