程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL查詢優化技巧

MySQL查詢優化技巧

編輯:關於MYSQL數據庫

1,查詢條件裡有不等號
SELECT * FROM `t_user` WHERE `id` != 2 中,id 的索引將不會被使用。

2,查詢條件裡使用了函數
SELECT * FROM `t_user` WHERE DAY(`regTime`) = 6 中,regTime 的索引將不會被使用。
3,在JOIN操作中,主鍵和外鍵的數據類型不同
SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 中,如果 t_user 表的 id 字段和 t_user_city 表的 userId 字段數據類型不同,那麼這兩個字段的索引將不會被使用。
4,查詢條件裡使用比較操作符 LIKE 和 REGEXP,只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。
①SELECT * FROM `t_user` WHERE `name` LIKE ‘123%’ 和 ②SELECT * FROM `t_user` WHERE `name` LIKE ‘%123’ 中,① 查詢能使用 name 的索引,而 ② 查詢卻不行。
使用索引查詢出的記錄數量超過全表記錄的30%,MySQL 會遍歷全表。
SELECT * FROM `t_user` WHERE `isNovice` = 1 中,t_user 表所有的記錄都會被遍歷,因為 isNovice 只有 0 和 1 這兩個值,記錄數各占 50%,設置 isNovice 為索引沒有任何意義。

除了注意以上的幾條規則以外,還有一些構造的技巧,也可以幫助你提升查詢的效率。

1,嘗試使用 IN 代替 OR
①SELECT * FROM `t_user` WHERE `id` = 2 OR `id` = 4 OR `id` = 6 OR `id` = 8 OR `id` = 10 和 ②SELECT * FROM `t_user` WHERE `id` IN (2, 4, 6, 8, 10) 中,② 的效率明顯比 ① 要高的多。
2,避免在查詢條件中使用函數
①SELECT * FROM `t_user` WHERE DATE(`regTime`) = ‘2010-02-01’ 和 ②SELECT * FROM `t_user` WHERE `regTime` > ‘2010-02-01’ AND `regTime` < ‘2010-02-02’ 中,② 的效率明顯比 ① 要高的多。 3SELECT `userId`, SQRT(POW(`unitX`, 2) + POW(`unitY`, 2)) AS `distance` FROM `t_map_unit` WHERE `userId` = 2 中,計算距離的操作完全可以由程序來做,或者在需要的時候再用程序計算。為了圖一時方便,讓數據庫來運算,是得不償失的。
3,盡量避免使用聯合查詢
①SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 和 ②SELECT * FROM `t_user_city` 、③SELECT `name` FROM `t_user` WHERE `id` IN (……) ,我更建議使用後者,實際上通過增加簡單的程序處理就可以實現,但是效率上區別確是很大的,特別是當 2 個表的記錄都很多的時候。兩個查詢有時候比一個更快,這完全取決於查詢語句的復雜度。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved