博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于是否走索引的讨论
阅读量:5113 次
发布时间:2019-06-13

本文共 1873 字,大约阅读时间需要 6 分钟。

1、两个同样结构的语句一个没有用到索引的问题:

查1到20号的就不用索引,查1到5号的就用索引,为什么呢?不稳定?
 
mysql> explain select * from test where f_submit_time between '2009-09-01' and '2009-09-20' \G; 
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: ALL
possible_keys: PRIMARY,submit_time_index
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 365628
        Extra: Using where
1 row in set (0.02 sec)
 
 
mysql> explain select * from test where f_submit_time between '2009-09-01' and '2009-09-5' \G;  
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: range
possible_keys: PRIMARY,submit_time_index
          key: submit_time_index
      key_len: 8
          ref: NULL
         rows: 52073
        Extra: Using where
1 row in set (0.00 sec)
 
 
说明:
二叉树索引本来最适合的就是点查询,和小范围的range查询,
当预估返回的数据量超过一定比例( 貌似当预估的查询量达到总量的30% )的时候,
再根据索引一条一条去查就慢了,反而不如全表扫描快了。Mysql有自己内部自动优化机制,
但有些自动优化机制可能不是最优的。这时候就需要人工去干预。
比如长期不优化表,Mysql判断出索引不优,就会不使用索引。
有时候就要人工强制使用真正高效的索引(FORCE INDEX)。
 

其实当本身的查询就约等于一个全表查询的时候,强不强制使用索引基本上没什么效果。

2、再看个例子:

    今天遇到一个奇怪的问题,明明已经建立了索引,select语句的explain也表明会利用这个索引,可是结果偏偏没有用索引,最后扫描了全表。

    两个结构完全一样的sql语句:

     sql1: select * from table where col_a = 123 and col_b in (‘foo’,\'bar’) order by id desc;

    sql2: select * from table where col_a = 456 and col_b in (‘foo’,\'bar’) order by id desc;
    结果sql1选择利用了col_a的索引,速度很快,sql2利用了主键ID的索引,扫描了全表(40w行)。
    仔细分析,发现数据库中,col_a=456的记录数有近1万条,而col_a=123的记录数只有几条。
    于是就清楚了,mysql选择索引不仅仅依据查询结构和索引结构,还会根据索引大概估算选择每种索引的数据量,然后选择他认为最快的索引。
    可能是主键索引会比普通index更快,所以mysql最后选择了数据量跟大的id索引。
    那么,如何解决这个问题呢?
     很简单,只要在order语句里写多个键即可,比如:order by col_a, id desc

REF:mysql查询中利用索引的机制  

3、本质原因:Cardinality(索引基数)

很关键的一个参数,平均数值组=索引基数/表总数据行,平均数值组越接近1就越有可能利用索引。

索引选择性是不重复的索引值也叫基数(cardinality)表中数据行数的比值,索引选择性=基数/数据行,基数可以通过“show index from 表名”查看。   

高索引选择性的好处就是mysql查找匹配的时候可以过滤更多的行,唯一索引的选择性最佳,值为1。

4、关于 mysql 索引优化与使用请见:

由浅入深探究mysql索引结构原理、性能分析与优化

转载于:https://www.cnblogs.com/xuedognqing/p/9856499.html

你可能感兴趣的文章
SQL利用Case When Then多条件判断
查看>>
2018-2019-1 20189215 书籍速读
查看>>
虚拟主机安全配置方法
查看>>
Git-分支管理
查看>>
python 中出现 “IndentationError: expected an indented block” 问题
查看>>
异常处理的资料
查看>>
寒假作业01
查看>>
iOS - 应用程序国际化
查看>>
H5智能表单
查看>>
[转]MBTiles 1.2 规范翻译
查看>>
基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!...
查看>>
net core体系-网络数据采集(AngleSharp)-1初探
查看>>
Sublime Text 3
查看>>
插入排序的C、C++实现
查看>>
C# 创建ACCESS数据库(转载)
查看>>
Excel批量导入数据库
查看>>
Asp.net 5学习
查看>>
爬虫入门----小说下载(静态网页的文字爬取)
查看>>
测试工具安装(JMeter,Postman)
查看>>
C# 多线程、控制线程数提高循环输出效率
查看>>