MySql 學習筆記一:SQL語句優化

衣舞晨風發表於2016-10-04

一、資料庫三正規化

第一正規化:1NF是對屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關係型資料庫都滿足1NF)
第二正規化:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三正規化:3NF是對欄位冗餘性的約束,它要求欄位沒有冗餘。 沒有冗餘的資料庫設計可以做到。
但是,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,允許冗餘。

二、SQL語句優化

1、SQL優化的一般步驟

  1. 通過show status命令瞭解各種SQL的執行頻率。
  2. 定位執行效率較低的SQL語句-(重點select)
  3. 通過explain分析低效率的SQL語句的執行情況
  4. 確定問題並採取相應的優化措施

2、SQL語句優化-show引數

MySQL客戶端連線成功後,通過使用show [session|global] status 命令可以提供伺服器狀態資訊。其中的session來表示當前的連線的統計結果,global來表示自資料庫上次啟動至今的統計結果。預設是session級別的。下面的例子:

show status like 'Com_%';

其中Com_XXX表示XXX語句所執行的次數。
重點注意:Com_select,Com_insert,Com_update,Com_delete通過這幾個引數,可以容易地瞭解到當前資料庫的應用是以插入更新為主還是以查詢操作為主,以及各類的SQL大致的執行比例是多少。
比如:

SHOW status LIKE 'Com_select';

這裡寫圖片描述

還有幾個常用的引數便於使用者瞭解資料庫的基本情況。
Connections:試圖連線MySQL伺服器的次數
Uptime:伺服器工作的時間(單位秒)
Slow_queries:慢查詢的次數 (預設是慢查詢時間10s)

show status like 'connections'; 
-- 顯示慢查詢次數
show status like 'slow_queries';
-- 修改慢查詢界定時間為2秒
set long_query_time=2;

3、SQL語句優化-定位慢查詢

(未測試)

在預設情況下mysql不記錄慢查詢日誌,需要在啟動的時候指定:

bin\mysqld.exe - -safe-mode  - -slow-query-log [mysql5.5 可以在my.ini指定]
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

先關閉mysql,再啟動, 如果啟用了慢查詢日誌,預設把這個檔案放在
my.ini 檔案中記錄的位置
Path to the database root
datadir=”C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/”
先定位到mysql安裝目錄中bin資料夾所在的目錄(未盡到bin資料夾內部)
再執行命令
這裡寫圖片描述
通過慢查詢日誌定位執行效率較低的SQL語句。慢查詢日誌記錄了所有執行時間超過long_query_time所設定的SQL語句。

本文部分內容整理自itcast講義,在此表示感謝。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章