Yani ben şöyle bir sorgu var:
SELECT col1, col2, col3 ...
FROM action_6_members m
LEFT JOIN action_6_5pts f ON f.member_id = m.id
LEFT JOIN action_6_10pts t ON t.member_id = m.id
LEFT JOIN action_6_weekly w ON w.member_id = m.id
WHERE `draw_id` = '1' ORDER BY m.id DESC LIMIT 0, 20;
Şimdi bu büyük (3.5 milyon * 40 bin * 20 bin) katılmak yapıyor
yani benim fikrim oldu:
do SELECT * FROM action_6_members WHERE
draw_id = '1' ORDER BY id DESC LIMIT 0, 20;
then loop over that using php to build
$in = "IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)"
;
then run
select * from action_6_5pts where member_id in $in
select * from action_6_10pts where member_id in $in
select * from action_6_weekly where member_id in $in
sonra, php kullanarak tüm bunları bir araya Smush
Bu i dört farklı sorgular kullanıyorum rağmen ben yerine sadece tümü üzerinde birleştirme yapmanın, her 20 satır seçmek ediyorum, demektir.
I önemli bir performans bonusu fark edeceksiniz?
Update
So, the general consensus is, 'DONT DO THAT!'
Burada app genel bakış
bu, bir kod alır
kod, bir 5pt, 10pt, ya da bir haftalık kod belirtilebilir
all three code types are in seperate tables. the three tables have code, and member_id
action_6_members tablodaki id member_id bağlantıları.
Bir kod talep edildiği zaman veri action_6_members tablosunda doldurulur.
Bu üyesinin kimliği daha sonra iddia edildi kodu tablosunda doldurulur.
Yukarıdaki sorgu ilk yirmi üyelerini seçer.
Benim soru ise.
Bunu geliştirmek için ne yapabiliriz?
olarak şu anda her şey tamamlandı sorguları önce aşımına uğruyor.
action_6_members
CREATE TABLE `action_6_members` (
`id` int(11) NOT NULL auto_increment,
`draw_id` int(11) NOT NULL,
`mobile` varchar(255) NOT NULL,
`fly_buys` varchar(255) NOT NULL,
`signup_date` datetime NOT NULL,
`club` int(11) NOT NULL default '0' COMMENT '1 = yes, 2 = no',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1337 DEFAULT CHARSET=latin1
action_6_ 5 and 10pts
CREATE TABLE `action_6_5pts` (
`code` varchar(255) NOT NULL,
`member_id` int(11) NOT NULL,
PRIMARY KEY (`code`),
KEY `member_id` (`member_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
action_6_weekly
CREATE TABLE `action_6_weekly` (
`id` int(11) NOT NULL auto_increment,
`code` varchar(255) NOT NULL,
`member_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `member_id` (`member_id`)
) ENGINE=MyISAM AUTO_INCREMENT=3250001 DEFAULT CHARSET=latin1
Update 2: explain the query
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE m ALL \N \N \N \N 1390 Using temporary; Using filesort 1 SIMPLE f ALL member_id \N \N \N 36000 1 SIMPLE t ALL member_id \N \N \N 18000 Using where 1 SIMPLE w ref member_id member_id 4 m.id 525820 Using where
Just had this through: Latest load data from DB 7.26, 4.60, 2.45
1.0 Normal maksimum yüktür ... yukarıda şey o 'patlama' vardı ve işlemek için ek süreçler üzerinde çağrı demektir. yani 7.26 yük blade sunucu 7 x max ve yardım için başkalarına aramak zorunda anlamına gelir
yani şu anda bu sorgu bir canavar, atıştırmalık olarak beslenme canavarlardan daha fazla ...