8

私はmysqlに次のクエリを説明させました:

SELECT carid,pic0,bio,url,site,applet 
FROM cronjob_reloaded 
WHERE 
carid LIKE '%bmw%' 
OR 
carid LIKE '%mer%' 
OR 
age BETWEEN '5' AND '10' 
OR 
category IN ('used') 
ORDER BY CASE 
    WHEN carid LIKE '%bmw%' OR carid LIKE '%mer%' THEN 1 
    WHEN age BETWEEN '5' AND '10' THEN 2 
    ELSE 3 
END 

そして、ここに説明の結果があります:

EXPLAIN SELECT carid, pic0, bio, url, site, applet
FROM cronjob_reloaded
WHERE carid LIKE '%bmw%'
OR carid LIKE '%mer%'
OR carid IS NOT NULL
AND age
BETWEEN '5'
AND '10'

私がこれを理解していないこと:

ここに画像の説明を入力してください

  1. キーがNULLなのはなぜですか?

  2. このクエリを高速化できますか?0.0035秒かかります-これは1000行のテーブルで遅いですか速いですか?

私のテーブルでは、caridがテーブルの主キーです。

4

2 に答える 2

3

MySQLは、クエリに使用するインデックスを見つけられませんでした。

クエリの速度はCPUに依存し、数行の場合は、使用可能なRAM、システム負荷、およびディスク速度にも依存します。を使用BENCHMARKして、クエリを数回実行し、より高い精度で時間を計測できます(たとえば、100,000回実行し、合計時間を100,000で除算します)。

索引付けの問題に関して:あなたのWHERE節は、、、carid(そして間接的に)ageを含みます。最初に(直接一致を要求するため)、、そして最後にインデックスを作成する必要があります。categoryperformeridcategoryagecarid

CREATE INDEX test_index ON cronjob_reloaded ( category, age, carid );

これにより、MySQLがWHEREクエリのフェーズに必要とするほとんどの情報が単一のインデックス操作にまとめられます。

追加performeridすると、いくつかの要因に応じて、これが高速化される場合とされない場合があります。私はなしで始めて、多分後でそれをテストするでしょう。

更新:元のクエリが変更されたようで、performerid表示されなくなりました。

最後に、1000行は通常非常に短い時間で済むため、MySQLはすべてをロードして独自のソートを行う方が高速であるため、インデックスをまったく使用しないことを決定する場合もあります。WHERE

于 2012-09-12T14:33:18.220 に答える
2

ドキュメントによると:

「キーがNULLの場合、MySQLはクエリをより効率的に実行するために使用するインデックスを検出しませんでした。」

公式文書については、以下のリンクを参照してください。

Mysql Doc

編集 :

インデックスへのリンクは次のとおりです

mysqlインデックスの仕組み-SO

インデックスの作成方法

この助けを願っています!

于 2012-09-12T14:27:08.313 に答える