Mysql索引和查询优化

Mysql索引和查询优化

说明:从微信上看到的一篇文章功能,觉得写得不错,就记录下来。

索引基数:
  基数是数据列所包含的不同值的数量。例如,某个数据列包含值1、3、7、4、7、3,那么它的基数就是4
  索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别(只有"M"和"F"两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是"30%"。(匹配的数据量超过一定限制的时候查询器会放弃使用索引。尽量不使用会导致索引失效的条件,比如in,用exists子查询代替,或者in的条件少时可以用union all来代替)。
 
索引失效的原因

  • 索引列运算,运算包括(+、-、*、/、!、<、>、%、like’’%_);

  • 类型错误。例如:字段类型是varchar,where条件用int 或者其他;

  • 如果条件有or,即使其中有条件也不会使用。如果要使用or,又想索引有效,就只能将or中的条件都加上索引;

  • 如果列类型是字符串,那一定要在条件中数据使用引号,否则不会使用索引;
    -组合索引没有遵循最左原则

  • like以%开头;
    -where中索引列有运算或者where中索引列使用了函数;

索引的建立

  • 最重要的肯定是根据业务经常查询的语句
  • 尽量选择区分度高的列作为索引,区分度的公式是count(DISTINCT col)/(count(*),公式表示不重复的比率,比率越大扫描的记录数就越少。
  • 最好选择唯一性索引 。唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

查询优化

  • 学会使用explain + SQL;
    在这里插入图片描述
    这里需要解释一下各个字段的含义
    在这里插入图片描述
    SQL编写注意
  • where语句的解析顺序是从右到左,条件尽量放where 不要放 having
  • 尽量不要使用distinct 语句,可以使用group by 来优化
  • 连表查询不要超过三个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值