常见的几种MySQL数据优化方式分享

电子说

1.3w人已加入

描述

  选取最适合的字段属性

  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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分