2017-02-01 7 views
0

私は次のような問題があります:2 MySQLはわずか数変化(いくつかの新しい列、異なるデータ)との最初のデータベースに基づいており、元の1とDatabase_2、あるDatabase_1をデータベースMySQLのスロークエリ問題

があります。

私はデータベースから3テーブルを含むクエリを実行すると、私は非常に異なるパフォーマンス結果を得ます。私は両方のデータベースを同じlocalhostサーバーでテストしていました。

問合せ:

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `applicants` AS `Applicant` 
LEFT JOIN `authake_users` AS `User` ON (`Applicant`.`authake_user_id` = `User`.`id`) 
LEFT JOIN `projects` AS `Project` ON (`Project`.`applicant_id` = `Applicant`.`id`) 
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL; 

クエリの実行時間:

Database_1 - 0.3秒 - 1分40秒

- それは 速く

Database_2ですけれども、このデータベースは1大きいです

3つのテーブルMyISAMエンジンを使用しています。テーブルの申請者とプロジェクトには文字セットutf8があり、テーブルauthake_usersには文字セットlatin1があります。

私はインデックスをチェックしました(両方のデータベースが全く同じインデックスを持っています)、それらを再構築し、ANALYZEとOPTIMIZEを3つのテーブルすべてで成功させました。

私が見つけた唯一の違いは、私が前にコマンドをEXPLAINでクエリを実行すると、以下を示している:

Database_1 がenter image description here

Database_2 enter image description here

誰が何の任意のアイデアを持っています探して?そのようなパフォーマンスの違いを引き起こす原因は何ですか?

+0

インデックスを確認してください。多分、レコード数によって違いがあります。 –

+0

あなたは下の私の答えをチェックする機会を得ましたか?それを試して更新してください。 –

答えて

1

MySqlクエリアナライザは、使用可能なリソースメモリに基づいて最適化計画を選択することを忘れないでください。しかし、テーブルとそのJOINプランの順序を変更することで、より良いプランを選択するのに役立ちます。

データベースへのアクセス権がありません。また、このクエリで必要とする出力がわからないため、分析できません。しかし、いくつかの提案されている以下のあなたはWHERE

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `authake_users` AS `User` 
LEFT JOIN `applicants` AS `Applicant` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
    AND `User`.`login` LIKE _latin1 '%1000%' 
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
    AND `Project`.`id` IS NULL; 

なしJOINSとの順序を変更することによりWHERE

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `applicants` AS `Applicant` 
LEFT JOIN `authake_users` AS `User` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
    AND `User`.`login` LIKE _latin1 '%1000%' 
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
    AND `Project`.`id` IS NULL; 

なし

あなたのクエリを試してみることができますJOINSのため変更することによって、あなたのクエリ - 1

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `authake_users` AS `User` 
LEFT JOIN `applicants` AS `Applicant` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL; 

JOINSのため変更することによって、あなたのクエリ - 2

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `projects` AS `Project` 
LEFT JOIN `applicants` AS `Applicant` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
LEFT JOIN `authake_users` AS `User` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL; 

をプラスあなたはインデックスの利益を取得したい場合User.login LIKE _latin1 '%1000%'条件の完全な種類が避けるべきです。あなたが本当にそれを必要とするならば、このようなものを使うのが良いです。User.login LIKE _latin1 '1000%'

私が提案したクエリのEXPLAINを投稿することができれば、非常に興味があります。

+0

ありがとう、本当に "JOINS - 1"の解決策の順序を変更すると、クエリを大幅に固定する –

+0

クール!また、 'EXPLAIN'の詳細を分かち合うことができればさらにうまくいくでしょう:) –