今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對于Web應用尤其明顯。關于數據庫的性能,這并不只是DBA才需要擔心的事,而更是程序員需要關注的事情。當我們設計數據庫表結構,操作數據庫時(尤其是查表時),我們都需要注意SQL語句操作數據的的性能。希望下面的優化技巧對你有用。
1. 為查詢緩存優化你的查詢
大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的數據庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,后續的相同的查詢就不用操作表而直接訪問緩存結果了。這里主要的問題是,我們某些查詢SQL語句會讓MySQL不使用緩存。請看下面的示例:
~~~
// 查詢緩存不開啟
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
// 開啟查詢緩存
$today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
~~~
上面兩條SQL語句的差別就是 ,MySQL的查詢緩存對CURDATE()這個函數不起作用。像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存,因為這些函數的返回是會不定的易變的。所以,你所需要做的就是用一個變量來代替SQL語句中的函數,從而開啟緩存。
2. 只要一行數據時使用 LIMIT 1
當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去fetch游標,或是你也許會去檢查返回的記錄數。在這種情況下,加上 LIMIT 1 可以增加性能。這樣一樣,MySQL數據庫引擎會在找到一條數據后停止搜索,而不是繼續往后查少下一條符合記錄的數據。下面的示例,只是為了找一下是否有“中國”的用戶,很明顯,后面的語句會比前面的更有效率。(請注意,第一條中是Select *,第二條是Select 1)
~~~
// 沒有效率的:
$r = mysql_query("SELECT * FROM user WHERE country = 'China'");
if (mysql_num_rows($r) > 0) {
// ...
}
// 有效率的:
$r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1");
if (mysql_num_rows($r) > 0) {
// ...
}
~~~
- 授權管理
- 角色管理
- 設置密碼
- 5.6 版本
- 系統用戶
- 當前用戶
- 目錄
- 設計規劃
- 數據字典
- 狀態監控
- 查看MYSQL表占用空間狀態
- show table status
- SHOW 命令
- SHOW TABLE STATUS
- 表格輸出
- 調優
- 書籍培訓
- 數據庫管理員的第一本書(原書第2版)
- 視頻
- 收獲,不止SQL優化
- 基本概念
- 工具
- phpMyadmin
- 變更管理
- 數據關系與原則
- 數據完整性
- 業務完整性
- 字段更新(1)
- 訂單應用(1)
- 訂單應用(2)
- 表間數據連接
- 數據管理
- Cheet Sheet
- Database Administrator
- 索引設計
- Mysql 四種常見的索引
- MySQL索引之主鍵索引
- MySQL索引使用對查詢、插入速度的影響
- 查詢優化
- 存儲優化
- 分割數據表字段
- Procedure_Analyse優化表結構
- 性能優化
- 拆分DELETE/INSERT語句
- MySQL命令
- 表復制
- 如何快速創建相同結構的表
- 主鍵設計
- 為什么推薦InnoDB引擎使用自增主鍵?
- INFORMATION_SCHEMA
- _5.6版本
- USER_PRIVILEGES