-1

ID をプライマリとする大きなテーブルがあります。約 300 万行あり、指定された ID リストに基づいて小さな行セットを抽出する必要があります。

現在、私はどこでそれをやっていますが、5〜10秒のように非常に遅いです。

私のコード:

select id,fa,fb,fc 
from db1.t1 
where id in(15,213,156,321566,13,165,416,132163,6514361,... );

一度に 1 つの ID を照会しようとしましたが、それでも遅いです。お気に入り

select id,fa,fb,fc from db1.t1 where id =25;

また、一時テーブルを使用して ID リストを挿入し、Join を呼び出してみました。でも改善なし。

select id,fa,fb,fc from db1.t1 inner join  db1.temp  on t1.id=temp.id

速くする方法はありますか?

ここにテーブルがあります。

CREATE TABLE  `db1`.`t1` (
  `id` int(9) NOT NULL,
  `url` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL,
  `lastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lastModified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

わかりました、ここで選択について説明します。

id=1,
select_type='SIMPLE', 
table='t1', 
type='range', 
possible_keys='PRIMARY', 
key='PRIMARY',
key_len= '4',
ref= '', 
rows=9, 
extra='Using where'
4

3 に答える 3

0

まず第一に、私が間違っていなければ、クラスター化インデックスは非クラスター化インデックスよりも高速です。次に、テーブルにインデックスがある場合でも、再インデックスを作成したり、統計を作成して再構築したりします。

SQL Explain Plan で、(...) で where ID を使用すると、それが Where (ID =1) or (ID=2) or (Id=3)..... に変換されるので、リストが大きくなるのを見ました。多くの or があるため、非常に大きなテーブルでは IN () を避けます

この SQL を「説明」してみると、実際のボトルネックがどこにあるかがわかります。このリンクを確認してくださいhttp://dev.mysql.com/doc/refman/5.5/en/explain.html うまくいくことを願っています

于 2013-11-27T03:31:34.483 に答える