选取最适合的字段属性

2、尽可能的把字段设置成NOTNULL,这样在执行查询的时候,数据库不用去比较NULL值。

使用连接(JOIN)来代替子查询是(sub-Queries)

例:将客户基本信息表中没有任何订单的客户删除掉

利用子查询先从销售信息表中将所有发出订单的客户ID取出,然后将结果传递给主查询。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,在某些情况下,子查询可以被更有效率的连接(JOIN)替代。

SELECT*FROMcustomerinfoWHERECustomerIDNOTIN(SELECTCustomerIDFROMsalesinfo)

SELECT*FROMcustomerinfoLEFTJOINsalesinfoONcustomerinfo.CustomerID=salesinfo.CustomerIDWHEREsalesinfo.CustomerIDISNULL

SwiftCode

连接(JOIN)之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需求两个步骤的查询工作。

Union查询可以把需要使用临时表的两条或者更多的select查询合并成一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库的整齐、高效。使用union来创建查询的时候,只需要用union作为关键字把多个select语句连接起来就可以了(所有的select语句中的字段数目相同)

SELECTName,BirthDateFROMauthorUNION

事务

BEGIN;INSERTINTOsalesinfoSETCustomerID=14;UPDATEinventorySETQuantity=11WHEREitem=‘book’;COMMIT;

锁定表

LOCKTABLEinventoryWRITESELECTQuantityFROMinventoryWHEREItem=‘book’;

UPDATEinventorySETQuantity=11WHEREItem=‘book’;UNLOCKTABLES

使用外键

例如,外键可以保证每一条销售记录都指向某一个存在的客户。外键可以把customerinfo表中的CustomerID映射到salesinfo表中的CustomerID,任何的一条没有合法CustomerID的记录都不会被更新或者插入到salesinfo中。

NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;

FOREIGNKEY(CustomerID)REFERENCEScustomerinfo(CustomerID)ONDELETECASCADE)TYPE=INNODB;

使用索引

一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况

优化查询语句

在相同类型的字段间进行比较的操作。

例如:在一个date类型的字段上使用yeae()函数时,将会使索引不能发挥应有的作用。

SELECT*FROMbooksWHEREnamelike“MySQL%”

最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。