1

450,000レコードのユーザーテーブルがあります。テーブルの構造は次のとおりです。

  UserID Int(11) Primary Key
  Firstname (50) Varchar
  Lastname  (50) Varchar

また、他の2つのテーブルをチェックして、UserIDがそれらのテーブルにあるかどうかを確認する必要があります。(構造は少し異なりますが、テーブルのUserIDは同じです)以下でこのサブクエリを実行していますが、実行速度が非常に遅くなっています。少し速く走るのを助けるために新鮮な視点を提供するために2番目の目を感謝してください...

SELECT 
`Users`.`Firstname`, 
`Users`.`Lastname`, 
`Users`.`UserID` 
FROM `Users`
WHERE `Users`.`UserID` IN  (SELECT `admin`.`UserID` FROM `admin` WHERE `admin`.`UserID`=`User`.`UserID`)
AND `Users`.`UserID` IN  (SELECT `elite`.`UserID` FROM `elite` WHERE `elite`.`UserID`=`Users`.`UserID`)
AND `Users`.`Lastname` LIKE '%smith%'
4

3 に答える 3

2

サブクエリの代わりに内部結合を使用する必要があると思います...現在、管理テーブル、エリートテーブルからユーザーIDを取得しており、同じものがユーザーテーブルにある必要があるためです...違い。

于 2012-04-09T14:01:11.883 に答える
2

MySQL でクエリを最適化する際に絶対に最も重要なことは、適切なインデックスがあることを確認することです。使用しているインデックス (SHOW INDEX を使用) と、クエリが使用しているインデックス (EXPLAIN SELECT を使用) を確認します。テーブルが大きくなった場合、インデックスは優れたパフォーマンスを得るために絶対に不可欠です。

UserID特に、3 つのテーブルすべての列にインデックスがあることを確認する必要があります。状況に適している場合は、外部キー制約を追加することもお勧めします。

ただし、正しいインデックスがあることを既に確認しているにもかかわらず、適切なパフォーマンスが得られない場合は、副選択の代わりに結合を使用してみてください。

SELECT 
    Users.Firstname, 
    Users.Lastname, 
    Users.UserID 
FROM Users
JOIN admin USING (UserID)
JOIN elite USING (UserID)
WHERE Users.Lastname LIKE '%smith%'

LIKE '%smith%'ではインデックスを効率的に使用できないことに注意してください。可能であれば、ワイルドカードで始まる LIKE 式を避ける必要があります。

于 2012-04-09T14:00:13.000 に答える
1

結合から始めます。

SELECT 
`Users`.`Firstname`, 
`Users`.`Lastname`, 
`Users`.`UserID` 
FROM `Users`
INNER JOIN `admin` ON (`Users`.`UserID` = `admin`.`Users`)
INNER JOIN `elite` ON (`Users`.`UserID` = `elite`.`UserID`)
WHERE `Users`.`Lastname` LIKE '%smith%'

次に、インデックスを確認します。

また、文字列の最初または最後に固定されていないため、名前の検索が遅くなることも避けてくださいLastname

于 2012-04-09T14:00:17.483 に答える