zoukankan      html  css  js  c++  java
  • mysql使用注意事项

    1、如果在(a,b,c)三个字段上建立联合索引,那么它能够加快 a | (a,b) | (a,b,c) 三组查询速度。

    select count(distinct left(code, 5))/count(*) from device;

    说明:建索引时使用上述语句看看区分度,选择合适的长度,通常区分度达到80%左右就可以建索引了。

    2、建联合索引的时候,区分度最高的字段在最左边。

    3、如果建立了(a,b)联合索引,就不必再单独建立 a 索引。同理,如果建立了(a,b,c)联合索引,就不必再单独建立 a、(a,b) 索引。

    4、存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如where a>? and b=?,那么即使 a 的区分度更高,也必须把 b 放在索引的最前列。

    5、最左侧查询需求,并不是指 SQL 语句的 where 顺序要和联合索引一致,但建议保持一致。

    6、范围条件有:<、<=、>、>=、between等。范围列可以用到索引(联合索引必须是最左前缀),但是范围列后面的列无法用到索引,索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。

    7、在字段上进行计算不能命中索引,应把计算放到业务层。如:select * fromdoc where YEAR(create_time) <= '2016'。

    8、强制类型转换会全表扫描。

    9、更新十分频繁、数据区分度不高的字段上不宜建立索引。更新会变更 B+ 树,更新频繁的字段建立索引会大大降低数据库性能。“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似。

    10、order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。例如对于语句 where a=? and b=? order by c,可以建立联合索引(a,b,c)。

    11、如果索引中有范围查找,那么索引有序性无法利用,如 WHERE a>10 ORDER BY b;,索引(a,b)无法排序。

    12、MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,那当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。selecta.* from 表1 a,(select id from 表1 where 条件 limit100000,20 ) b where a.id=b.id

    13、SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。consts:单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。ref:使用普通的索引(Normal Index)。range:对索引进行范围检索。当 type=index 时,索引物理文件全扫,速度非常慢。

    14、单表索引建议控制在5个以内。单索引字段数不允许超过5个。字段超过5个时,实际已经起不到有效过滤数据的作用了。

    15、错误观点:索引越多越好,认为一个查询就需要建一个索引。宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。抵制惟一索引,认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。过早优化,在不了解系统的情况下就开始优化。

    16、使用如下方式来避免 sum 的 NPE 问题:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table。

  • 相关阅读:
    Linux任务调度
    用户管理——用户和用户组
    Linux实用指令
    spring模拟ioc
    浅谈log4j-3-不同输出样式
    浅谈log4j-2
    浅谈log4j
    windows下安装kibana
    【PHP】 解决报错:Error: php71w-common conflicts with php-common-5.4.16-43.el7_4.x86_64
    mysql 8.0设置日期为0000-00-00 00:00:00时报错
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/12750269.html
Copyright © 2011-2022 走看看