table1
time userid id1 id2
9/1/2014 3:30 user1 123 555
9/1/2014 3:32 user1 123 555
9/1/2014 3:13 user1 123 555
9/1/2014 3:15 user1 123 555
9/1/2014 3:38 user2 321 555
9/1/2014 3:21 user2 321 555
9/1/2014 3:38 user2 456 666
9/1/2014 3:21 user2 456 666
table2
id1 orderid
321 order1
123 order2
解釋查詢:MySQL查詢速度很慢,需要幫助優化
select_type table type possible index key key_len ref row Extra
SIMPLE table1 ALL 934420 Using where; Using temporary; Using filesort
SIMPLE table2 ref lookupindex lookupindex 33 table1.id1 1
我table1的具有約十億行,表2是具有20K行查找表,爲了555約爲100萬行。 id2約佔整個表格1的10%。 table2基本上是具有所有id1的查找表。 id1-> orderid有多對一的關係。換句話說,一個id1只屬於一個orderid。 除userid外,table2和table1不具有空值。
我想計算每個orderid的唯一用戶數。
我的查詢需要很長時間才能運行(5小時內沒有完成,所以我停止了它),我不知道如何優化它以外的索引。我有table2.id1索引。
select table2.orderid, count(distinct userid)
from table1 left join table2 on table1.id1 = table2.id1
where table1.id2="555"
group by table2.orderid
用MySQL做了左連接第一或where語句第一?應存儲順序555到不同的表,然後運行他們查詢?
fields'table1.id2','table2.orderid' have index? – 2014-10-03 19:23:54
將「EXPLAIN」放在您的查詢之前並執行它.MySQL將吐出執行路徑和優化你的查詢,你可以在加入之前看到它是否先過濾「555」(我非常懷疑它的確如此)。http://dev.mysql.com/doc/refman/5.0/en/explain。 html – JNevill 2014-10-03 19:25:10
[閱讀關於'EXPLAIN'](http://dev.mysql.com/doc/refman/5.0/en/using-explain.html)。 – Air 2014-10-03 19:25:15