MYSQL sql优化我的心得

1、字段空间能小则小,索引不该建立在大字段上;

2、索引字段设置not null 给默认值;

3、使用ENUM、TINYINT类型比文本类型效率高;

4、选择离散程度大的字段建立索引;

5、索引应建立在那些将用于JOIN、WHERE条件判断、ORDERBY排序的字段上;

6、在大量数据转移(插入到新表)时,将数据先转移到一个没有索引(除了主键)的表上,再建立其它索引,这样比,直接转移到一个已经创建好索引的表上,前者效率要高很多;

7、数据插入采用批量操作;如 INSERT INTO t (id, name) VALUES(1,’Bea’), (2,’Belle’),(3,’Bernice’);不要一条一条插入;

8、in条件中的子查询集用关联查询后where条件判断代替;

    如SELECT * FROM customerinfo WHERE CustomerID NOT IN(SELECT CustomerID FROM salesinfo);

    用SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID WHERE salesinfo.CustomerID IS NULL;

9、字段子查询,如果子查询目标表的数据比较少,可以使用;

10、减少独占的范围;

    如事务操作

    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操作的同步,也尽力的减少了因为同步需要独占表的范围;

11、最好是在相同类型的字段间进行比较的操作;

12、在建有索引的字段上尽量不要使用函数进行操作;

13、在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的;

    例如:下面的查询将会比较表中的每一条记录。

    SELECT* FROM books

    WHERE name like”MySQL%”;

    但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:

    SELECT* FROM books

    WHERE name>=”MySQL”and name<”MySQM”;

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

15、ORDER BY NULL禁止排序

    SELECT goods_id,count(*) FROM t GROUP BY goods_id;

     默认情况下,MySQL对所有GROUP BY col1,col2…的字段进行排序。

    如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序;

待续….

    原文作者:大黑跟小白的日常
    原文地址: https://www.jianshu.com/p/3a036ec42b20
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞