美文网首页
MYSQL sql优化我的心得

MYSQL sql优化我的心得

作者: 大黑跟小白的日常 | 来源:发表于2019-02-22 22:15 被阅读404次

    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禁止排序;

    待续....

    相关文章

      网友评论

          本文标题:MYSQL sql优化我的心得

          本文链接:https://www.haomeiwen.com/subject/qluyyqtx.html