SQL優化、mysql數據庫優化

SQL優化、mysql數據庫優化
    1、字段空間能小則小
    2、字段設置not null 給默認值
    3、使用ENUM類型比文本類型效率高,如性別:男、女
    4、創建正確的索引
         一般說來,索引應建立在那些將用於JOIN,WHERE判斷和ORDERBY排序的字段上。儘量不要對數據庫中某個含有大量重複的值的字段建立索引。
            對於一個大的數據庫,將數據裝載到一個沒有FULLTEXT索引的表中,然後再使用ALTERTABLE或CREATEINDEX創建索引,將是非常快的。
            但如果將數據裝載到一個已經有FULLTEXT索引的表中,執行過程將會非常慢
    5、in條件中的子查詢集 用 關聯查詢後where條件判斷 代替,如下:
SELECT
*
FROM
customerinfo
LEFT JOIN salesinfo
ON customerinfo.CustomerID=salesinfo.CustomerID
WHERE
salesinfo.CustomerID IS NULL;
代替
SELECT
*
FROM
customerinfo
WHERE
CustomerID NOT IN(SELECT CustomerID FROM salesinfo);
    事務     
事物以BEGIN關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那麼,ROLLBACK命令就可以把數據庫恢復到BEGIN開始之前的狀態。
BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book';COMMIT;
事務的另一個重要作用是當多個用戶同時使用相同的數據源時,它可以利用鎖定數據庫的方法來爲用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所幹擾。
儘管事務是維護數據庫完整性的一個非常好的方法,但卻因爲它的獨佔性,有時會影響數據庫的性能,尤其是在很大的應用系統中。
減少獨佔的範圍
    鎖定表
LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item='book';
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11 WHERE Item='book';UNLOCK TABLES;
    以保證insert操作後update的同步操作成功
這裏,我們用一個select語句取出初始數據,通過一些計算,用update語句將新值更新到表中。包含有WRITE關鍵字的LOCKTABLE語句可以保證在UNLOCKTABLES命令被執行之前,不會有其它的訪問來對inventory進行插入、更新或者刪除的操作。

    使用外鍵

鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。
CREATE TABLE customerinfo( CustomerID INT NOT NULL,PRIMARY KEY(CustomerID))TYPE=INNODB;
CREATET ABLE salesinfo( SalesID INT NOT NULL,CustomerID INT NOT NULL, PRIMARY KEY(CustomerID,SalesID),
                      FOREIGN KEY(CustomerID) REFERENCE Scustomerinfo(CustomerID) ON DELETE CASCADE) TYPE=INNODB;
        關係表的聯級刪除
注意例子中的參數“ON DELETE CASCADE”。該參數保證當customerinfo表中的一條客戶記錄被刪除的時候,salesinfo表中所有與該客戶相關的記錄也會被自動刪除。如果要在MySQL中使用外鍵,一定要記住在創建表的時候將表的類型定義爲事務安全表InnoDB類型。
    sql優化
         1、最好是在相同類型的字段間進行比較的操作;
         2、在建有索引的字段上儘量不要使用函數進行操作;
         3、在搜索字符型字段時,我們有時會使用LIKE關鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統性能爲代價的;
例如下面的查詢將會比較表中的每一條記錄。
SELECT * FROM books

WHERE name like "MySQL%";
但是如果換用下面的查詢,返回的結果一樣,但速度就要快上很多:
SELECT * FROM books

WHERE name>="MySQL" and name<"MySQM";
        4、應該注意避免在查詢中讓MySQL進行自動類型轉換,因爲轉換過程也會使索引變得不起作用;
        5、分組統計可以禁止排序;
           SELECT goods_id,count(*) FROM t GROUP BY goods_id;
              默認情況下,MySQL對所有GROUP BY col1,col2…的字段進行排序。
              如果查詢包括GROUP BY,想要避免排序結果的消耗,則可以指定ORDER BY NULL禁止排序
        6、批量INSERT插入;
INSERT INTO t (id, name) VALUES(1,’Bea’);
INSERT INTO t (id, name) VALUES(2,’Belle’);
INSERT INTO t (id, name) VALUES(3,’Bernice’);
—–>
INSERT INTO t (id, name) VALUES(1,’Bea’), (2,’Belle’),(3,’Bernice’);
見:

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