Mysql的優化一則

2021-09-22 14:16:48 字數 1330 閱讀 7296

目的在於這麼乙個sql語句:

select w.* from wall***** w inner join wall*****_category_relation r on w.wall*****_id = r.wall*****_id  where (r.category_level1_id=39 and w.is_online = 1)  order by w.online_time desc  limit 0,10;
這個sql語句是兩個錶連查,w表和r表進行連查,w表中查詢使用到的字段有is_online, online_time, wall*****_id, r表使用的字段有wall*****_id, category_level1_id

兩個表都是innodb

其中w表的情況如下:

主鍵為wall*****_id,沒有其他索引。

r表情況如下:

wall*****_id不是主鍵,但是wall*****_id+category_level1_id組成了索引。

這個查詢是個慢查詢。使用explain檢視:

可以看到其中以r表為主表,並且使用到了臨時表,這樣效率就低下了。。。

第乙個想到的是w表沒有建立任何索引,所以應該建立乙個is_online和online_time的索引。

這裡的區別就是原先由於w表沒有用得上的索引,sql查詢優化判斷使用r表做主表。後來w加上索引後,sql查詢自動優化,判斷以w表做主表更好,就先使用上了w表的索引。

當然如果你想要強制讓查詢以w表做主表,可以使用straight_join來替換inner join。straight_join就是強制使用join前面的表作為主表,查詢的。

select w.* from wall***** w straight_join wall*****_category_relation r on w.wall*****_id = r.wall*****_id where (r.category_level1_id=39 and w.is_online = 1) order by w.online_time desc limit 0,10

官方文件:

其實這個例子很簡單,最終就加了個索引就優化了。。。主要複習了下mysql的查詢優化

Mysql的優化一則

目的在於這麼乙個sql語句 select w.from wall w inner join wall category relation r on w.wall id r.wall id where r.category level1 id 39 and w.is online 1 order by...

Mysql的優化一則

目的在於這麼乙個sql語句 1 select w.from wall w inner join wall category relation r on w.wall id r.wall id where r.category level1 id 39 and w.is online 1 order ...

Mysql的優化一則

目的在於這麼乙個sql語句 1 select w.from wall w inner join wall category relation r on w.wall id r.wall id where r.category level1 id 39 and w.is online 1 order ...