mysql索引in怎么 mysql中索引的使用

mysql in 会使用索引吗MySQL中使用IN会不会走索引
文章很短mysql索引in怎么 , 先看下结论mysql索引in怎么,在看下文 。
结论mysql索引in怎么:IN肯定会走索引mysql索引in怎么,但是当IN的取值范围较大时会导致索引失效mysql索引in怎么,走全表扫描
navicat可视化工具使用explain函数查看sql执行信息
场景1:当IN中的取值只有一个主键时
我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引:
type结果值从好到坏依次是:
systemconsteq_refreffulltextref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexALL
all:全表扫描
index:另一种形式的全表扫描,只不过他的扫描方式是按照索引的顺序
range:有范围的索引扫描,相对于index的全表扫描,他有范围限制,因此要优于index
ref: 查找条件列使用了索引而且不为主键和unique 。其实,意思就是虽然使用了索引,但该索引列的值并不唯一 , 有重复 。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描 。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描 。
const:通常情况下,如果将一个主键放置到where后面作为条件查询,mysql优化器就能把这次查询优化转化为一个常量 。至于如何转化以及何时转化,这个取决于优化器
一般来说,得保证查询至少达到range级别,最好能达到ref , type出现index和all时,表示走的是全表扫描没有走索引,效率低下 , 这时需要对sql进行调优 。
当extra出现Using filesor或Using temproary时,表示无法使用索引,必须尽快做优化 。
possible_keys:sql所用到的索引
key:显示MySQL实际决定使用的键(索引) 。如果没有选择索引,键是NULL
rows: 显示MySQL认为它执行查询时必须检查的行数 。
这里可以参考之前写的一篇:用MySQL 执行计划分析 DATE_FORMAT 函数对索引的影响
场景2:扩大IN中的取值范围
此时仍然走了索引,但是效率降低了
场景3:继续扩大IN的取值范围
看上面的图,发现此时已经没有走索引了,而是全表扫描 。
在说一下结论
结论:IN肯定会走索引 , 但是当IN的取值范围较大时会导致索引失效,走全表扫描 。
By the way:如果使用了 not in , 则不走索引 。
mysql索引二叉搜索树、N叉树
页分裂:B+树mysql索引in怎么的插入可能会引起数据页mysql索引in怎么的分裂 , 删除可能会引起数据页的合并,二者都是比较重的IO消耗 , 所以比较好的方式是顺序插入数据,这也是mysql索引in怎么我们一般使用自增主键的原因之一 。
页分裂逆过程:页合并,当删除数据后,相邻的两个数据页利用率很低的时候会做数据页合并
主键索引:key:主键,value:数据页,存储每行数据
非主键索引:key:非主键索引,value:主键key,导致回表
最左匹配:优先将区分度高的列放到前面,这样可以高效索引,
最左匹配原则遇到范围查询就停止匹配,范围查询(、、between、like)为什么?因为出现范围匹配后,后面的索引字段无法保证有序,局部有序失去 , 顺序失去则无法提高查询效率
SELECT * FROMtableWHERE a IN (1,2,3) and b1;
如何建立索引?
还是对(a , b)建立索引,因为IN在这里可以视为等值引用 , 不会中止索引匹配,所以还是(a,b)!
索引组织表
索引用页存储:key【10】-point【6】 , 通过调整key大小,当页大小固定的情况下 , 通过调整key大小,使得N叉树变化;

推荐阅读