programmer1453 Diyelim ki users tablonuz var ve bu tabloda 2 milyon kayıt var. Bu tabloya şöyle bir sorgu yazdınız:
SELECT * FROM users WHERE created_at > '2023-01-01';
Kayıtların gelmesi 2-3 saniye sürdü ve siz de neden bu kadar yavaş geldiğini bulmak istiyorsunuz. Bunun için sorguyu ayıklamalısınız. Bunun için explain analyze kullanır. Ayıklamak istediğiniz sorgunun başına yazarsınız:
EXPLAIN ANALYZE
SELECT * FROM users WHERE created_at > '2023-01-01';
Bu size şöyle bir çıktı verir:
EXPLAIN: -> Filter: (created_at > '2023-01-01')
-> Table scan on users (cost=0.00..30578.00 rows=1000000 width=1012)
Filter: (created_at > '2023-01-01')
ANALYZE: Table users
rows_examined_per_scan: 2000000
rows_produced_per_join: 0
filter_duration: 0.073965 seconds
rows_examined_per_join: 0
scan_duration: 2.119688 seconds
rows_produced_per_scan: 0
Bunu yorumlamanız lazım ve nasıl yorumlanacağı burada anlatabileceğim bir şey değil. Deneyip araştırıp öğrenmeniz gerekiyor ama kısaca gördüğümü yorumlamam gerekirse sorgu planlayıcısı created_at alanı için bir index bulamadığı için table scan yapmak zorunda kalmış yani tüm tabloyu taramış, bu da size 2.12 saniyeye mal olmuş. Bu durumda artık created_at alanına index oluşturmam gerektiğini biliyorum.
CREATE INDEX index_created_at ON users (created_at);
Şimdi tekrar explain analyze uyguladığımda şu sonucu alıyorum:
EXPLAIN: -> Index range scan on users using index_created_at (cost=0.00..6.00 rows=100 width=1012)
Index Cond: (created_at > '2023-01-01')
ANALYZE: Table users
rows_examined_per_scan: 100
rows_produced_per_join: 0
filter_duration: 0.000036 seconds
rows_examined_per_join: 0
scan_duration: 0.000601 seconds
rows_produced_per_scan: 0
Bu sefer created_at alanı için oluşturulan index sayesinde index scan yapmış ve sorgu ışık hızında tamamlanmış (0.000601 saniye). SQL yazabilmek için bunları araştırıp öğrenmeniz gerekiyor.
https://dev.mysql.com/doc/refman/8.0/en/explain.html