zoukankan      html  css  js  c++  java
  • MYSQL 开发总结

    1、mysql中,VARCHAR(N)中的N代表的是字符数,而不是字节数。例如VARCHAR(255)表示可以保存255的中文

    2、过大的长度会消耗更多的内存。VARCHAR(N),存储时是按照数据实际长度存储的。当把数据读入到内存时,为了提高效率,是按照N的长度分配内存的。

    3、尽可能将所有列定义为NOT NULL。

    a、索引NULL列,需要额外的空间来保存,所以要占用更多的空间。

    b、进行比较和运算时要对NULL值做特别的处理,同时可能导致索引失效。

    4、避免数据类型的隐式转换。隐式转换会导致索引失效。

    例如select * from tablea where id = '123',这里id其实是整数类型的,这就出现了隐式转换

    5、充分利用表上已经存在的索引

    a、避免使用双%号或前置%的查询条件。如a like '%123%'或a like '%123',这些可能无法使用索引。

    b、一个SQL只能利用到复合索引中的一列进行范围查询

    例如联合索引(a,b,c) ,如果对a的都是范围查询的话,那么对于b和c的索引是用不到的。这时,应该把a类放在最右侧,即(b,c,a)

    c、使用left join或not exists来优化not in操作。not in通常会使索引失效

    d、在mysql优化生成执行计划时,会比较各个索引的效率,进而生成最终的执行计划。过多的索引,会导致这个过程变慢,进而体现在sql的执行时间上

    6、禁止使用不含字段列表的INSERT语句,例如INSERT INTO T VALUES(A,B,C),这样表结构变化可能会导致兼容异常。应该为INSERT INTO T(c1,c2,c3) VALUES(A,B,C)

    7、避免使用子查询,可以把子查询优化为join操作。

    a、子查询的结果集无法使用索引

    b、子查询会产生历史表的操作(子查询结果一般会保存在临时表中,无论是内存临时表或是数据库临时表,他们不会使用到索引),如果子查询数据量大则严重影响效率

    c、因为子查询会查询临时表,且不使用索引,所以数据量大时,会消耗过多的CPU及IO资源

    8、避免使用JOIN关联太多的表

    a、每join一个表会多占一部分内存(join_buffer_size)

    b、会产生临时表操作,影响查询效率

    c、MySQL最多允许关联61个表,建议不超过5个

    9、减少同数据库的交互次数

    a、数据库更适合处理批量操作

    b、合并多个相同的操作到一起,可以提高处理效率

    10、对于同一列,使用in代替or,in内的数据最好不超过500个。个人经过explain执行计划,似乎没有发现这条规律。

    11、WHERE从句中禁止对列进行函数抓换和计算,否则会导致无法使用索引。

    例如where date(createtime) = '20160901',无法使用索引。

    12、在明显不会有重复值时使用union all而不是union。

    a、union会把所有数据放在临时表中后再进行去重操作

    b、union all不会再对结果集进行去重操作

  • 相关阅读:
    C# 多态性
    C# FileStream类
    C# File文件类
    加快访问GitHub的速度
    Git-修改.gitignore后使其配置生效的方法总结
    ES6 解构赋值
    avue表单数据请求
    uniapp canvas组件复用
    uniappH5 fly.js Golang 解决跨域问题
    java bug记录
  • 原文地址:https://www.cnblogs.com/hurry-up/p/9442634.html
Copyright © 2011-2022 走看看