mysql僅查詢一條數據時的雷區

場景:有用戶表user,有id,email,user_name,mobile等字段,現在要求根據指定email帳號查詢一個用戶。

乍一看,這個需求簡單,不用考慮直接寫出了一下sql

select * from user where email='[email protected]';

這時,就有可能踩雷了。

分析一下這個雷區,存在以下幾種情形:

  • 1.email列沒有建立索引

這種情況下,就悲劇了。由於沒有索引,即使email的記錄不重複,也會全表掃描。

  • 2.email列有普通索引
    這種情況下能避免全表掃描,能用到索引,但是還會繼續使用到where條件進行過濾。

  • 3.email列有唯一索引
    這種情況最高效,與where id=xxx幾乎一樣的效率(前提是id是主鍵索引)

解決方案

在僅查詢一條記錄的時候,無論where條件是否有索引有什麼樣的索引,最好在條件後面加limit 1限制一下。這樣就能避免全表掃描,儘可能提高查詢的效率。養成這樣的意識習慣,就不會踩坑。

select * from user where email='[email protected]' limit 1;

原理:當mysql查詢時,如果有limit 1限制,查詢到滿足條件的第一條記錄的就返回結果,不會繼續查詢下去。

特殊情況

假如email列沒有索引,且剛好記錄在數據表的最後一條,這樣limit 1實際上也會全表掃描,這種情況下就最好考慮給email列加索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章