masif katılır önlemek için dörde bir sorgu bölme?

0 Cevap php

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

0 Cevap