選取最適合的字段屬性
2、盡可能的把字段設置成NOT NULL,這樣在執行查詢的時候,數據庫不用去比較NULL值。
使用連接(JOIN)來代替子查詢是(sub-Queries)
例:將客戶基本信息表中沒有任何訂單的客戶刪除掉
利用子查詢先從銷售信息表中將所有發出訂單的客戶ID取出,然后將結果傳遞給主查詢。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,并且寫起來也很容易。但是,在某些情況下,子查詢可以被更有效率的連接(JOIN)替代。
SELECT * FROM customerinfo WHERE CustomerID NOT IN (SELECTC ustomerID FROM salesinfo)
SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID WHERE salesinfo.CustomerID ISNULL
Swift Code
連接(JOIN)之所以更有效率一些,是因為MySQL不需要在內存中創建臨時表來完成這個邏輯上的需求兩個步驟的查詢工作。
Union查詢可以把需要使用臨時表的兩條或者更多的select查詢合并成一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證數據庫的整齊、高效。使用union來創建查詢的時候,只需要用union作為關鍵字把多個select語句連接起來就可以了(所有的select語句中的字段數目相同)
SELECT Name,BirthDate FROM author UNION
事務
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’;
UPDATE inventory SET Quantity=11 WHERE Item=‘book’; UNLOCKTABLES
使用外鍵
例如,外鍵可以保證每一條銷售記錄都指向某一個存在的客戶。外鍵可以把customerinfo表中的CustomerID映射到salesinfo表中的CustomerID,任何的一條沒有合法CustomerID的記錄都不會被更新或者插入到salesinfo中。
NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;
FOREIGNKEY(CustomerID) REFERENCES customerinfo(CustomerID) ON DELETE CASCADE)TYPE=INNODB;
使用索引
一般說來,索引應建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。盡量不要對數據庫中某個含有大量重復的值的字段建立索引。對于一個ENUM類型的字段來說,出現大量重復值是很有可能的情況
優化查詢語句
在相同類型的字段間進行比較的操作。
例如:在一個date類型的字段上使用yeae()函數時,將會使索引不能發揮應有的作用。
SELECT * FROM books WHERE name like“MySQL%”
最后,應該注意避免在查詢中讓MySQL進行自動類型轉換,因為轉換過程也會使索引變得不起作用。
編輯:hfy
-
MySQL
+關注
關注
1文章
851瀏覽量
27764
發布評論請先 登錄
MySQL數據庫:理解MySQL的性能優化、優化查詢

評論