子查詢指的是乙個查詢是另外乙個查詢的條件,之間關係是用in來構建
雖然有時候用explain顯示是用到索引 但是看到rows的時候就發現還是掃瞄了最外邊表中的大多數數資料 (這種情況出現在了mysql5.5和5.6版本裡邊。5.7得到了優化)
看兩個例子
update
task_manager
inner join
(select
task_id
from
task_details_manager
where task_state = '5'
and client_id = clientid) detail
on task_manager.id = detail.task_id set task_state = '90',
update_date = date_add(
date_format(now(), '%y-%m-%d %h:%i:%s'),
interval floor(rand() * 5) minute
),task_state_record = (
case
right(task_state_record, 2)
when '90'
then task_state_record
else concat(task_state_record, ",90")
end) ;
和update
task_manager
settask_state = '90',
update_date = date_add(
date_format(now(), '%y-%m-%d %h:%i:%s'),
interval floor(rand() * 5) minute
),task_state_record = (
case
right(task_state_record, 2)
when '90'
then task_state_record
else concat(task_state_record, ",90")
end)
where id in
(select
task_id
from
task_details_manager
where task_state = '5'
and client_id = clientid) ;
這兩個sql在高低版本的mysql查詢速度截然不同 第乙個掃瞄了1行 但是第二個卻掃瞄了1260000行。
另外發現update 居然也可以用inner 不得不驚嘆mysql實在太靈活了
select 為什麼效率低
索引知識延申 3.索引是建的越多越好嗎 增大網路開銷 有時會誤帶上如log iconmd5之類的無用且大文字字段,資料傳輸size會幾何增漲。如果db和應用程式不在同一臺機器,這種開銷非常明顯 即使 mysql 伺服器和客戶端是在同一臺機器上,使用的協議還是 tcp,通訊也是需要額外的時間。準確來說...
通過MySQL慢查詢日誌定位執行效率低的SQL語句
利用命令 show variables like query 檢視是否開啟慢查詢日誌 slow query log on表示開啟,off表示關閉 long query time 單位秒,如果查詢超過此處設定的秒數,則會被寫入到慢查詢日誌中 slow query log file 慢查詢日誌的目錄 如...
虛函式效率低的原因
設想一下,如果說不是虛函式,那麼在編譯時期,其相對位址是確定的,編譯器可以直接生成jmp invoke指令 如果是虛函式,多出來的一次查詢vtable所帶來的開銷,倒是次要的,關鍵在於,這個函式位址是動態的,譬如 取到的位址在eax裡,則在call eax之後的 那些已經被預取進入流水線的所有指令都...