2016-11-30 81 views
0
# Query_time: 0.007476 Lock_time: 0.000012 Rows_sent: 4 Rows_examined: 13463 
SELECT id,name FROM items 
WHERE items_approved = 1 AND item_name LIKE '%apple%' 
ORDER BY RAND() LIMIT 4; 

我只注意到我有很多的查詢速度慢的在我的mysql-的slow.log 所以我開始優化它們一個接一個......提高我的MySQL查詢

讓我們從這個簡單的查詢:

SELECT id,name FROM items 
WHERE items_approved = 1 AND item_name LIKE '%red%' 
ORDER BY RAND() LIMIT 4; 

但該表包含15K項目,所以我需要一個更好的方式來獲得4個隨機項目。 該項目表有兩個索引:名稱上的一個全文和編號上的一個主文件

在我的電子商務中,目標基本上是顯示4個隨機項目,每個類別的名稱中都有「紅色」大約15個類別)用戶訪問一個頁面。

什麼是更好的方法呢?

UPDATE

my.cnf中設置這樣

log_slow_queries = /var/log/mysql/mysql-slow.log 
long_query_time = 2 
log-queries-not-using-indexes 
+0

你有沒有索引定義? – BenM

+0

少於1秒是好的。您可能會將您的slow_queries設置爲0.嘗試將其提高到更合理的數字,以便您可以跟蹤真正的慢速查詢。 – aynber

+1

不到1秒就好了?那是什麼樣的邏輯? – BenM

回答

0
SELECT id,name FROM items 
WHERE items_approved = 1 
    AND item_name LIKE '%red%' -- '% %' doesnt use index, change to FULL TEXT SEARCH 
ORDER BY RAND() 
LIMIT 4; 

檢查MySQL索引的TIPS

如果你有全文索引應該嘗試類似:

SELECT id,name FROM items 
WHERE items_approved = 1 
    AND MATCH(item_name) 
    AGAINST('red' IN BOOLEAN MODE) 
ORDER BY RAND() 
LIMIT 4;