zoukankan      html  css  js  c++  java
  • 数据库mysql注意点及sql优化

    一 注意点
    1、delete、truncate、drop;可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了
    2、慎用insert into select,select语句会进行相关数据加锁,如无索引条件会进行全表加锁。

    二 sql语句优化点
    1、通过EXPLAIN分析低效的SQL执行计划
    - select_type:表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。
    - table:输出结果的表名
    - type:表示MySQL在表中找到所需行的方式,或者叫访问类型
    常见的有:ALL index range ref eq_ref const,system NULL,从左到右,性能由最差到最好。
    type=ALL:全表扫描。type=index:索引全扫描,MySQL遍历整个索引来查询。type=range:索引范围扫描,常见于<、<=、>、 >=、 between。type=ref:使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录。type=eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique index作为关联条件。type=const/system:单表中最多有一个匹配行,查询起来非常迅速,一般主键primary key或者唯一索引unique index进行的查询,通过唯一索引uk_email访问的时候,类型type为const;而从我们构造的仅有一条记录的a表中检索时,类型type为system。type=NULL:MySQL不用访问表或者索引,就能直接得到结果。
    类型type还有其他值,如ref_or_null(与ref类似,区别在于条件中包含对NULL的查询)、index_merge(索引合并优化)、unique_subquery(in的后面是一个查询主键字段的子查询)、index_subquery(与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询)
    - possible_keys:表示查询时可能使用的索引。- key:表示实际使用的索引。- key_len:使用到索引字段的长度。- rows:扫描行的数量- Extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。Using where:表示优化器除了利用索引来加速访问之外,还需要根据索引回表查询数据。
    2、insert语句,如果同时从同一客户插入很多行,尽量使用多个值表的 INSERT 语句,这种方式将大大
    缩减客户端与数据库之间的连接、关闭等消耗,使得效率比分开执行的单个 INSERT 语 句快(在一些情况中几倍)。下面是一次插入多值的一个例子:
    insert into test values(1,2),(1,3),(1,4)
    3、避免使用not in,not in失去索引效果。
    4、select count(id) < count(1) < count(*).
    5、inner join,left/right join来代替子查询
    6、在使用like进行数据表的查询时,能用单%的情况下,不建议使用双%,双%查询会导致mysql引擎放弃使用索引而进行全表扫描查询。
    7、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
    8、很多时候用 exists 代替 in 是一个好的选择:
    select num from a where num in(select num from b)
    用下面的语句替换:
    select num from a where exists(select 1 from b where num=a.num)
    9、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
    10、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from t where num is null
    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
    select id from t where num=0 。

    索引相关,请看:https://mp.weixin.qq.com/s/oxd52q9DLF7cUV7zic_xrQ

  • 相关阅读:
    会议管理要素
    项目管理—沟通管理
    项目管理的五大过程组和十大知识领域
    fastjson $ref引用问题
    项目管理——问题解决方法
    windows服务器添加磁盘后,提示The disk is offline because of policy set by an administrator的解决办法
    关于bat/cmd中转义符的使用
    关于bat中日期时间字符串的格式化
    关于windows服务器的Security安全类日志的导出
    关于windows服务器创建一个ps1脚本的周期性定时任务
  • 原文地址:https://www.cnblogs.com/stubborn-dude/p/13959052.html
Copyright © 2011-2022 走看看