1

以前は ms-sql でデータベースを開発していましたが、現在は mysql に移行しています。大きな進歩。問題は、クエリの実行計画をグラフィカルに表示するツールがないことです... EXPLAIN実際には役に立ちません。

したがって、これについてあなたのアドバイスが必要です:

約 50000 エントリのテーブルがあります。次の 2 つのクエリは同じ結果を返しますが、巨大なデータベースではどちらがより効率的/高速になるかを知る必要があります。最初のものでは、連結は where にありますが、2 番目のものでは、having 句を含む select にあります。

SELECT idPatient, lastName, firstName, idCardNumber 
FROM optical.patient 
WHERE CONCAT(lastName,' ',firstName) LIKE "x%"; 


SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
HAVING formattedName LIKE "x%"; 

ご回答ありがとうございます。

4

2 に答える 2

3

どちらのバージョンでも、クエリはインデックスを使用して WHERE を解決できず、テーブル全体のスキャンを実行します。ただし、次のものと同等です。

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%"; 

そして、インデックスを使用できますlastName

2 つのフィールドのいずれかで検索する必要がある場合は、union

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE firstName LIKE "x%"; 
UNION 
SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%"; 
于 2011-10-03T13:40:21.297 に答える
1

CONCATどちらの場合もすべての行に対して実行する必要があるため、これら2つのクエリの間に違いは見られないと思います。formattedNameデータベースにインデックスを追加できるので、データベースにも保存することを検討します。これはおそらく、クエリを最適化するためにできる最善の方法です。

余談ですが、出力pt-visual-explainの視覚化に役立つ場合がありますEXPLAIN

于 2011-10-03T13:33:50.100 に答える