0
我有一個有200萬行的Mysql表。 大小是600Mb。在一個200萬行的表中加速慢計數
此查詢需要2秒鐘。 我不知道如何加快速度。該表已經是Myisam格式。 我不知道我是否達到了選擇計數緩慢的極限。
SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'
感謝所有
我有一個有200萬行的Mysql表。 大小是600Mb。在一個200萬行的表中加速慢計數
此查詢需要2秒鐘。 我不知道如何加快速度。該表已經是Myisam格式。 我不知道我是否達到了選擇計數緩慢的極限。
SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'
感謝所有
是的,它可以被優化。
首先,您正在使用LIKE
進行全面掃描,因爲MySQL不能使用左變量(對於';car;%'
而不是'%;car;%'
)的索引。其次,MySQL(大多數情況下)不會使用多於一個索引的SELECT
,所以如果您有兩個單獨的索引rate
和tags
,則只會使用一個索引。
因此,要處理這些事情我建議:1。 使用全文索引tags
列, 2.用兩個單獨的查詢一個查詢「膠水」與INNER JOIN
結果(等於WHERE ... AND ...
在這種情況下) 。
那麼到底:
SELECT t1.* FROM
(SELECT * FROM yvideos WHERE rate >= 60) t1
INNER JOIN
(SELECT * FROM yvideos WHERE MATCH (tags) AGAINST ('+car +russia -usa' IN BOOLEAN MODE)) t2
USING (id);
對此查詢執行EXPLAIN
並查看計劃。現在沒有完全掃描,所有的過濾都使用索引完成。
有關布爾全文搜索的更多信息,您可以閱讀a documetation。
順便提一下,InnoDB和MyISAM都支持全文索引,因此您可以決定引擎。
'rate'是否存儲爲數值?您可以嘗試使用WHERE rate> = 70而不是WHERE rate> ='70',因爲數字比較應該更快。 – trevor