2012-04-05 27 views
6

Bu sorguyu tamamlamak için birkaç saniye sürer bir sorun yaşıyorum. Birçok optimizasyonu zaten denedim ama bu noktada boşluklar çekiyorum.JOIN JOIN bu sorguyu kullanırken JOIN çok yavaş

tablolar şunlardır (ve kesinlikle özellikle tam izler tablo normalize değildir)

CREATE TABLE `tracks` (
`id` int(14) unsigned NOT NULL AUTO_INCREMENT, 
`artist` varchar(200) NOT NULL, 
`track` varchar(200) NOT NULL, 
`album` varchar(200) NOT NULL, 
`path` text NOT NULL, 
`tags` text NOT NULL, 
`priority` int(10) NOT NULL DEFAULT '0', 
`lastplayed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
`lastrequested` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
`usable` int(1) NOT NULL DEFAULT '0', 
`accepter` varchar(200) NOT NULL DEFAULT '', 
`lasteditor` varchar(200) NOT NULL DEFAULT '', 
`hash` varchar(40) DEFAULT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `hash` (`hash`), 
FULLTEXT KEY `searchindex` (`tags`,`artist`,`track`,`album`), 
FULLTEXT KEY `artist` (`artist`,`track`,`album`,`tags`) 
) ENGINE=MyISAM AUTO_INCREMENT=3336 DEFAULT CHARSET=utf8 

CREATE TABLE `esong` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`hash` varchar(40) COLLATE utf8_bin NOT NULL, 
`len` int(10) unsigned NOT NULL, 
`meta` text COLLATE utf8_bin NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `hash` (`hash`) 
) ENGINE=InnoDB AUTO_INCREMENT=16032 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

CREATE TABLE `efave` (
`id` int(10) unsigned NOT NULL DEFAULT '0', 
`inick` int(10) unsigned NOT NULL, 
`isong` int(10) unsigned NOT NULL, 
UNIQUE KEY `inick` (`inick`,`isong`), 
KEY `isong` (`isong`), 
CONSTRAINT `inick` FOREIGN KEY (`inick`) REFERENCES `enick` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `isong` FOREIGN KEY (`isong`) REFERENCES `esong` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `enick` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT 
`nick` varchar(30) COLLATE utf8_bin NOT NULL, 
`dta` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`dtb` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
PRIMARY KEY (`id`), 
KEY `nick` (`nick`) 
) ENGINE=InnoDB AUTO_INCREMENT=488 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

ve Ben normal bir hızla yürütmeye çalışıyorum sorgu aşağıdaki

SELECT esong.meta, tracks.id FROM tracks RIGHT JOIN esong ON tracks.hash = esong.hash JOIN efave ON efave.isong = esong.id JOIN enick ON efave.inick = enick.id WHERE enick.nick = lower('nickname'); 
olduğunu

DOĞRU JOIN'i kaldırıp JOIN olarak değiştirirseniz, hızlıdır

EXPLAIN bana bu sonucu verir, efave'de küçük bir sorun var gibi görünüyor seçimim ancak bunun nasıl yapılacağı hakkında bir fikrim yok.

+----+-------------+--------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref     | rows | filtered | Extra     | 
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------+ 
| 1 | SIMPLE  | enick | ref | PRIMARY,nick | nick | 92  | const     | 1 | 100.00 | Using where; Using index | 
| 1 | SIMPLE  | efave | ref | inick,isong | inick | 4  | radiosite.enick.id | 12 | 100.00 | Using index    | 
| 1 | SIMPLE  | esong | eq_ref | PRIMARY  | PRIMARY | 4  | radiosite.efave.isong | 1 | 100.00 |       | 
| 1 | SIMPLE  | tracks | ALL | hash   | NULL | NULL | NULL     || 100.00 |       | 
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------+ 
+1

'Parçalar 'tablosu için' COLLATE' değeri nedir? –

cevap

5

Kişisel açıklamak görünüyor temiz, benim için sıyrılıyor tek şey esong tablo utf8_bin bir harmanlama kullanıyor olması, ve izler tablosunda bir harmanlama belirtilmemişse, bu muhtemelen başka bir harmanlama türünü kullanması anlamına gelir. Harmanlarınızı hizalamayı deneyin ve birleştirme işleminin nasıl yapıldığını görün.

+0

Bu gerçekten sorun oldu, izler tablosundaki harmanlama utf8_general_ci iken, diğer üçü de utf8_bin. Kesinlikle harika. – Wessie

+0

Ahhh işe yaradığı için memnun oldum. Parça tablosuna utf8_bin harmanını eklediğinizi mi sanıyorum? –

+2

İlk olarak utf8_bin parçalara ekledim, ancak bu tam metin indeksini büyük/küçük harfe duyarlı hale getirdi. Bu yüzden hepsini hepsini utf8_general_ci olarak değiştirdim. – Wessie

0

İcra Planınızı kontrol ettiniz mi? Değilse, sorgunuzu dahil etmek için çalıştırın. Sağ Katmanınız, bir Dizin Araması yerine Dizin Taraması yapıyor olabilir. Veya endeksleri eksik olabilirsiniz. Her iki durumda da, İcra Planınıza bakmanız ve böylece sorgunuzu daha iyi optimize edebilmeniz gerekir. Hiç kimse, gerçek sorunun ne olduğunu bilene kadar bir Hak Sahibi (veya bu konuyu birleştirme) kullanarak daha hızlı nasıl yapacağınızı söyleyemeyecektir. http://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html SqlServer için : İşte bazı linkler .. MySQL için olan http://www.sql-server-performance.com/2006/query-execution-plan-analysis/

+1

Soruda yürütme planı var - son açıklamanın çıkışı. – piotrm

+0

Maalesef, bunun yürütme planının sonucu olduğunu bilmiyordum. Ben bile kontrol etmedim - Sorgunun kendisinin sonucu olduğunu düşündüm. Kontrol edeyim. –