Geçen hafta, dev'te test edilen sorgularımdan birinin, test sunucumda tarama yaptığı bir sınama işleminden geçtikten sonra bir sorunla karşılaştım.Mysql, sunucu değiştirirken sorguları tarar
Bu sorgudaki dizinlerden birine FORCE INDEX ekleyerek giderildi.
Şimdi üretim sunucusuna içine aynı veritabanını yüklü ettik (ve KUVVET INDEX komutu ile çalışıyor ve tekrar yavaşladı.? Test gerçekleşmesi böyle bir şey neden ne herhangi bir fikir ve prod hem
İşte sorgu var. (dev aksine) aynı işletim sistemi ve MySQL versiyonunu çalıştıran ve ondan açıklar.
EXPLAIN SELECT showsdate.bid, showsdate.bandid, showsdate.date, showsdate.time,
-> showsdate.title, showsdate.name, showsdate.address, showsdate.rank, showsdate.city, showsdate.state,
-> showsdate.lat, showsdate.`long` , tickets.link, tickets.lowprice, tickets.highprice, tickets.source
-> , tickets.ext, artistGenre, showsdate.img
-> FROM tickets
-> RIGHT OUTER JOIN (
-> SELECT shows.bid, shows.date, shows.time, shows.title, artists.name, artists.img, artists.rank, artists
-> .bandid, shows.address, shows.city, shows.state, shows.lat, shows.`long`, GROUP_CONCAT(genres.genre SEPARATOR
-> ' | ') AS artistGenre
-> FROM shows FORCE INDEX (biddate_idx)
-> JOIN artists ON shows.bid = artists.bid JOIN genres ON artists.bid=genres.bid
-> WHERE `long` BETWEEN -74.34926984058 AND -73.62463215942 AND lat BETWEEN 40.39373515942 AND 41.11837284058
-> AND shows.date >= '2009-03-02' GROUP BY shows.bid, shows.date ORDER BY shows.date, artists.rank DESC
-> LIMIT 0, 30
->)showsdate ON showsdate.bid = tickets.bid AND showsdate.date = tickets.date;
+----+-------------+------------+--------+---------------+-------------+---------+------------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+-------------+---------+------------------------------+--------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 30 | |
| 1 | PRIMARY | tickets | ref | biddate_idx | biddate_idx | 7 | showsdate.bid,showsdate.date | 1 | |
| 2 | DERIVED | genres | index | bandid_idx | bandid_idx | 141 | NULL | 531281 | Using index; Using temporary; Using filesort |
| 2 | DERIVED | shows | ref | biddate_idx | biddate_idx | 4 | activeHW.genres.bid | 5 | Using where |
| 2 | DERIVED | artists | eq_ref | bid_idx | bid_idx | 4 | activeHW.genres.bid | 1 | |
+----+-------------+------------+--------+---------------+-------------+---------+------------------------------+--------+----------------------------------------------+
Tablo türünün MyISAM olduğunu varsayıyorsunuz ve InnoDB değil - REPAIR TABLE yalnızca MyISAM motoru için geçerlidir. InnoDB'nin karşılaştırılabilir bir komutu yoktur. –
Bu bir MyISAM db, ve yapmam gereken şey olduğunu düşündüğüm gibi 'optimize' çalıştırmıştım. Şimdi iki tabloyu hem tamir hem de analiz ediyorum. büyük gelişme, ama bir şekilde benim dev & test makinelerim prod'dan daha hızlı. Prod .39 sn, dev .18 sn. – pedalpete
@Cody - Haklısınız. InnoDB için bunu yapmak için, sadece kukla bir ALTER deyimi kullanırsınız. ALTER TABLE my_table TYPE = 'InnoDB' gibi bir şey. –