2009-03-02 20 views
0

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 |            | 
+----+-------------+------------+--------+---------------+-------------+---------+------------------------------+--------+----------------------------------------------+ 

cevap

3

sana farklar hakkında bu soruyu sorduğumda ben ipucu verdi düşünüyorum dev -> testte.

Dizinleri yeniden oluşturmayı ve yeniden hesaplamayı denediniz mi? Genellikle, bir indeksi zorlamak, optimizatörün genellikle hangi endekslerin kullanılacağı konusunda iyi seçimler yapması nedeniyle kötü bir fikirdir. Ancak, bunun çalışması için iyi bir istatistik olduğunu ve dizinlerin ciddi şekilde parçalanmadığını varsayar.

ETA:

dizinleri yeniden oluşturmak için kullanın:

REPAIR TABLE tbl_name QUICK; 

istatistiklerini yeniden hesaplamak için:

ANALYZE TABLE tbl_name; 
+0

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. –

+0

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

+0

@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. –

0

Test sunucusu yalnızca 10 kayıtları ve üretim sunucusu 1000000000 kayıtları var mı? Bu, aynı zamanda farklı yürütme sürelerine de neden olabilir

0

İki sunucu aynı yapılandırılmış mı? MySQL'in performansında bir "devrilme noktası" geçiyormuş gibi geliyor. MySQL konfigürasyonlarını karşılaştırırdım; farklı bir hafıza parametresi olabilir.

İlgili konular