原來出現問題的語句:
explain select video.target,
video.state,
video.flag,
video.time_length,
video.upload_time,
video.cover_position,
video.click_count,
member.nickname
from
inner
join member on member.id= video.member_id
where video.display= 1
and video.game_id= '9930'
order
by video.`upload_time`
desc
limit 0,
20
慢查詢檢視執行計畫:出現了檔案排序和臨時表問題。
問題出現的原因:
mysql查詢存在直接關聯和非直接關聯的問題,這兩種查詢效率差別很大;(join member 的時候用的非直接關聯的video表去關聯,這往往會出現臨時表)
mysql排序盡量使用索引;
mysql多表關聯left join其他表的時候,如果以其他表的字段作為查詢條件都會產生臨時表;
mysql在非直接關聯的基礎上進行排序會很慢,需要進行優化;(用的是臨時表的upload_time進行排序,所以會慢)
解決方法:
把非關聯的表查詢條件改為子查詢,子查詢不在作為查詢條件
explain
select sql_no_cache video.target,
video.state,
video.flag,
video.time_length,
video.upload_time,
video.cover_position,
video.click_count,
(select nickname from
`member`
where id= video.`id`) as nickname #這部分代替原來的內連線查詢出來的暱稱
from
inner
where video.display= 1
and video.game_id= '9930'
order
bydesc #用了原表的條件排序
limit 0,
20
執行計畫: MySQL臨時表的優化方案
mysql 是全球最受歡迎的開源資料庫,作為開源軟體組合 lamp linux apache mysql perl php python 中的重要一環,廣泛應用於各類應用。web2.0 時代,風靡全網的社群論壇軟體系統 discuz 和部落格平台 wordpress 均基於 mysql 實現底層架構...
mysql臨時表更新 MySql 臨時表
今天在專案中遇到乙個,當mysql的in語句中資料量很大時,建立乙個臨時表的例子。於是樓主整理了一下關於臨時表的知識,與大家分享一下 首先,臨時表只在當前連線可見,當關閉連線時,mysql會自動刪除表並釋放所有空間。因此在不同的連線中可以建立同名的臨時表,並且操作屬於本連線的臨時表。建立臨時表 cr...
mysql 臨時表 限制 Mysql臨時表
當你建立臨時表的時候,你可以使用temporary關鍵字。如 create temporary table tmp table name varchar 10 not null,passwd char 6 not null 或create temporary table if not exists ...