基本的なクエリ テーブルの結合で返される時間が非常に遅い原因を見つけようとする助けをいただければ幸いです。
私は問題を抱えていたので、Profiling をオンにすると、返されるのに 19.7903 秒かかったクエリは、次のプロファイルの詳細を示しました。
Profiling
Status Time
starting 0.000044
Opening tables 0.000067
System lock 0.000002
Table lock 0.000006
init 0.000009
optimizing 0.000005
statistics 0.000011
preparing 0.000014
executing 0.000031
Sending data 0.000050
end 0.000004
end 0.000003
query end 0.000002
freeing items 0.000009
closing tables 0.000003
removing tmp table 0.000011
closing tables 0.000003
logging slow query 0.000002
cleaning up 0.000003
Showing rows 0 - 29 (2,200 total, Query took 19.7903 sec)
プロファイル時間の合計が「19.7903 秒」にならない理由がわかりません。
- 「プロファイル」の時間と「合計、クエリ」の時間は足し合わせる必要がありますか? <<<<<<<
クエリは次のとおりです。
SELECT OWNER.ID OWNER_ID,
OWNER.LAST_NAME OWNER_LAST_NAME,
OWNER.FIRST_NAME OWNER_FIRST_NAME,
OWNER.PHONE_HOME_AREACODE OWNER_PHONE_HOME_AREACODE,
OWNER.PHONE_HOME_PREFIX OWNER_PHONE_HOME_PREFIX,
OWNER.PHONE_HOME_LINE_NUMBER OWNER_PHONE_HOME_LINE_NUMBER,
OWNER.PHONE_CELL_AREACODE OWNER_PHONE_CELL_AREACODE,
OWNER.PHONE_CELL_PREFIX OWNER_PHONE_CELL_PREFIX,
OWNER.PHONE_CELL_LINE_NUMBER OWNER_PHONE_CELL_LINE_NUMBER,
/*Some columns from OWNER removed for brevity*/
OWNER.CITY OWNER_CITY,
OWNER.PROVINCE OWNER_PROVINCE,
OWNER.POSTAL OWNER_POSTAL,
OWNER.NOTES OWNER_NOTES,
OWNER.REFERRED_BY OWNER_REFERRED_BY,
VISITOR.NAME VISITOR_NAME,
VISITOR.SIZE VISITOR_SIZE,
VISITOR.INACTIVE VISITOR_INACTIVE,
VISITOR.ID VISITOR_ID,
VISITOR.DELETED VISITOR_DELETED,
VACCINATIONS.CANINE_DISTEMPER_PARVOVIRUS_EXPIRES VACCINATIONS_CANINE_DISTEMPER_PARVOVIRUS_EXPIRES,
VACCINATIONS.CANINE_RABIES_EXPIRES VACCINATIONS_CANINE_RABIES_EXPIRES,
VACCINATIONS.CANINE_BORDETELLA_EXPIRES VACCINATIONS_CANINE_BORDETELLA_EXPIRES,
VACCINATIONS.FELINE_FVRCPC_EXPIRES VACCINATIONS_FELINE_FVRCPC_EXPIRES,
VACCINATIONS.FELINE_RABIES_EXPIRES VACCINATIONS_FELINE_RABIES_EXPIRES
FROM OWNER
LEFT JOIN VISITOR
ON VISITOR.OWNER_ID = OWNER.ID
LEFT JOIN VACCINATIONS
ON VACCINATIONS.VISITOR_ID = VISITOR.ID
ORDER BY VISITOR_NAME
EXPLAIN の結果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE OWNER ALL NULL NULL NULL NULL 1483 Using temporary; Using filesort
1 SIMPLE VISITOR ref OWNER_ID OWNER_ID 4 wayDEV.OWNER.ID 1
1 SIMPLE VACCINATIONS ALL VISITOR_ID NULL NULL NULL 2059
索引:
VISITOR:
Indexes: Documentation Keyname Type Cardinality Action Field
PRIMARY PRIMARY 2227 Edit Drop ID
NAME INDEX 2227 Edit Drop NAME
OWNER_ID INDEX 2227 Edit Drop OWNER_ID
OWNER:
Indexes: Documentation Keyname Type Cardinality Action Field
PRIMARY PRIMARY 1601 Edit Drop ID
LAST_NAME INDEX 1601 Edit Drop LAST_NAME
VACCINATIONS:
Indexes: Documentation Keyname Type Cardinality Action Field
PRIMARY PRIMARY 2131 Edit Drop ID
VISITOR_ID UNIQUE 2131 Edit Drop VISITOR_ID
BOARDING:
Indexes: Documentation Keyname Type Cardinality Action Field
PRIMARY PRIMARY 2256 Edit Drop ID
OWNER INDEX 2256 Edit Drop OWNER_ID
VISITOR INDEX 2256 Edit Drop VISITOR_ID
GROOMING:
Indexes: Documentation Keyname Type Cardinality Action Field
PRIMARY PRIMARY 2077 Edit Drop ID
VISITOR_ID UNIQUE 2077 Edit Drop VISITOR_ID
OWNER INDEX 2077 Edit Drop OWNER_ID
このクエリは何ヶ月もうまく機能しています。ゆっくりと戻ってくるのはごく最近のことであり、断続的にしかありません。約 20% の確率で遅くなります。残りの時間は問題なく返されます(行0〜29を表示しています(合計2,200、クエリには0.0018秒かかりました))。? :\
それが断続的な問題であるという事実は、クエリ自体以外の問題を示しているでしょうか?? <<<<<<<
上で尋ねたように...プロファイル時間が「19.7903秒」にならない理由がわかりません。
「プロファイル」の時間と「合計、クエリ」の時間は足し合わせる必要がありますか? <<<<<<<
データベース全体でわずか数千のレコード。
どんな助けでも大歓迎です。私は Godaddy サーバーにいます。
(クエリに問題がある可能性があることを理解しています..または最適化できる可能性があります。しかし、ここでかなり具体的な質問をしています-「<<<<<<<」で指摘)
正直なところ...ここでは>>>>>>>20<<<<<<<秒について話している! 確かに、2000 レコードのデータベースに対するこのクエリは、20 秒戻ってこないはずです???