SELECT t_wenzhang.contents, t_wenzhang.createTime, t_wenzhang.title,t_wenzhang.pagePath FROM t_wenzhang LEFT JOIN t_keys ON t_keys.id = t_wenzhang.keyword where SUBSTRING( KeyP, 1, 1 )='" + zimu + "' order by createTime desc
上面t_wenzhang 表4W 資料,t_keys 3W,怎麼這個執行10+秒!如果和最佳化!
回複討論(解決方案)
首先是對t_keys.id,t_wenzhang.keyword,KeyP,zimu這4個欄位建立索引
其次如果還是慢可以試著改變一下引擎
最後可以用explan來協助選擇更好的索引和寫出更最佳化的查詢語句!
首先是對t_keys.id,t_wenzhang.keyword,KeyP,zimu這4個欄位建立索引
其次如果還是慢可以試著改變一下引擎
最後可以用explan來協助選擇更好的索引和寫出更最佳化的查詢語句!
4W 資料 聯合,怎麼會這麼慢?
主要就是索引與最佳化沒做好(特別是索引),當然,跟你的欄位的長度也有所關係
好的設計比好sql 好,不要太依靠sql 可以去瞭解nosql資料庫 對以後用sql有非常大協助,我現在基本一般不會去用左串連查詢了。 你這是文字查詢出文章的key?
合理最佳化表的索引,關鍵串連表的id加上索引。
where SUBSTRING( KeyP, 1, 1 )='" + zimu + "' 引起查詢變慢,貼出表結構看看。
SUBSTRING( KeyP, 1, 1 )='" + zimu + "'
不會使用索引,應寫作這樣
KeyP like '" + zimu + "%'
合理最佳化表的索引,關鍵串連表的id加上索引。
where SUBSTRING( KeyP, 1, 1 )='" + zimu + "' 引起查詢變慢,貼出表結構看看。
上面對t_wenzhang. 下面是 t_keys
SUBSTRING( KeyP, 1, 1 )='" + zimu + "'
不會使用索引,應寫作這樣
KeyP like '" + zimu + "%' 我要第一個字母 相等的,比如=a
實在不行還不如先建立一個暫存資料表,查詢完再刪掉!這樣效率快多了!
第一個字母相等就用:
like 'a%'
按照這個方法試下
SUBSTRING( KeyP, 1, 1 )='" + zimu + "'
不會使用索引,應寫作這樣
KeyP like '" + zimu + "%'
如果不行,請問樓主是在伺服器上測試還是本地,如果是伺服器上可以嘗試建立“預存程序”。
create procedure...
主要原因還是因為使用SUBSTRING函數,導致KeyP索引失效,換成"like '".zimu ."%'" 建立KeyP的索引,速度會提高很多。
如果索引都建了,主要原因就是在where條件中用了函數,同時也導致每次查詢都不會被緩衝,再就是join查詢要小結果集驅動大結果集
是mysql嗎?
SUBSTRING( KeyP, 1, 1 )='" + zimu + "' 這裡是php混著吧? 應該是 +$zimu+ 這樣?
改成 KeyP like '{$zimu}%' 或者 KeyP like '"+$zimu+"%'
t_keys.id 應該已有索引(主鍵)
t_wenzhang.keyword加索引
createTime 加索引
KeyP也加索引(可以加長度為1的索引)
然後, 就沒問題了
也不用left join了, join即可
t_是什麼意思