使用外鍵
鎖定表的方法可以維護數據的完整性但是它卻不能保證數據的關聯性這個時候我們就可以使用外鍵例如外鍵可以保證每一條銷售記錄都指向某一個存在的客戶在這裡外鍵可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID任何一條沒有合法CustomerID的記錄都不會被更新或插入到salesinfo中
CREATE TABLE customerinfo
(
CustomerID INT NOT NULL
PRIMARY KEY ( CustomerID )
) TYPE = INNODB;
CREATE TABLE salesinfo
(
SalesID INT NOT NULL
CustomerID INT NOT NULL
PRIMARY KEY(CustomerID SalesID)
FOREIGN KEY (CustomerID) REFERENCES customerinfo
(CustomerID) ON DELETECASCADE
) TYPE = INNODB;
注意例子中的參數ON DELETE CASCADE該參數保證當 customerinfo 表中的一條客戶記錄被刪除的時候salesinfo 表中所有與該客戶相關的記錄也會被自動刪除如果要在 MySQL 中使用外鍵一定要記住在創建表的時候將表的類型定義為事務安全表 InnoDB類型該類型不是 MySQL 表的默認類型定義的方法是在 CREATE TABLE 語句中加上 TYPE=INNODB如例中所示
使用索引
索引是提高數據庫性能的常用方法它可以令數據庫服務器以比沒有索引快得多的速度檢索特定的行尤其是在查詢語句當中包含有MAX() MIN()和ORDERBY這些命令的時候性能提高更為明顯那該對哪些字段建立索引呢?一般說來索引應建立在那些將用於JOIN WHERE判斷和ORDER BY排序的字段上盡量不要對數據庫中某個含有大量重復的值的字段建立索引對於一個ENUM類型的字段來說出現大量重復值是很有可能的情況例如customerinfo中的province 字段在這樣的字段上建立索引將不會有什麼幫助;相反還有可能降低數據庫的性能
我們在創建表的時候可以同時創建合適的索引也可以使用ALTER TABLE或CREATE INDEX在以後創建索引此外MySQL從版本開始支持全文索引和搜索全文索引在MySQL 中是一個FULLTEXT類型索引但僅能用於MyISAM 類型的表對於一個大的數據庫將數據裝載到一個沒有FULLTEXT索引的表中然後再使用ALTER TABLE或CREATE INDEX創建索引將是非常快的但如果將數據裝載到一個已經有FULLTEXT索引的表中執行過程將會非常慢
優化的查詢語句
絕大多數情況下使用索引可以提高查詢的速度但如果SQL語句使用不恰當的話索引將無法發揮它應有的作用下面是應該注意的幾個方面首先最好是在相同類型的字段間進行比較的操作在MySQL 版之前這甚至是一個必須的條件例如不能將一個建有索引的INT字段和BIGINT字段進行比較;但是作為特殊的情況在CHAR類型的字段和VARCHAR類型字段的字段大小相同的時候可以將它們進行比較其次在建有索引的字段上盡量不要使用函數進行操作
例如在一個DATE類型的字段上使用YEAE()函數時將會使索引不能發揮應有的作用所以下面的兩個查詢雖然返回的結果一樣但後者要比前者快得多
SELECT * FROM order WHERE YEAR(OrderDate)<
;
SELECT * FROM order WHERE OrderDate<
;
同樣的情形也會發生在對數值型字段進行計算的時候
SELECT * FROM inventory WHERE Amount/
<
;
SELECT * FROM inventory WHERE Amount<
*
;
上面的兩個查詢也是返回相同的結果但後面的查詢將比前面的一個快很多第三在搜索字符型字段時我們有時會使用 LIKE 關鍵字和通配符這種做法雖然簡單但卻也是以犧牲系統性能為代價的例如下面的查詢將會比較表中的每一條記錄
SELECT * FROM books
WHERE name like
MySQL%
但是如果換用下面的查詢返回的結果一樣但速度就要快上很多
SELECT * FROM books
WHERE name>=
MySQL
and name<
MySQM
最後應該注意避免在查詢中讓MySQL進行自動類型轉換因為轉換過程也會使索引變得不起作用
[] []
From:http://tw.wingwit.com/Article/program/MySQL/201311/29646.html