前言

网上经常能看到一些文章总结在 mysql 中不能命中索引的各种情况,其中有一种说法就是指使用了 or 的语句都不能命中索引。

这种说法其实是不够正确的,正确的结论应该是,从 mysql5.0 后,如果在 or 连接的字段上都有独立的索引的话,是可以命中索引的,这里就是用到了 index_merge 特性。

在 mysql5.0 版本以前一条 sql 只能选择使用一个索引,而且如果 sql 中使用了 or 关键字,那么已有的索引就会失效,会走全表扫描。因为无论走哪个索引,mysql 都不能一次性查找出符合条件的数据,所以只能放弃索引。

mysql 也是一直在不断升级更新,所以在 mysql5.0 版本后,增加了 index_merge 索引合并这个特性,也因此支持了一条 sql 使用多个索引。

index_merge 核心思想就是先分别使用单个索引查出满足要求的数据,然后再将这些数据合并到一起返回。
我们可以看一个的例子。

这里依然沿用我们前面文章中创建的表和测试数据,表中插入了 10 w 条测试数据,表结构如下。

CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
mysql> alter table t add index a_index(a);Query OK, 0 rows affected (0.17 sec)Records: 0 Duplicates: 0 Warnings: 0

那么我们给 b 字段也加上索引试试,然后再执行刚刚那条 sql 。

mysql> alter table t add index b_index(b);Query OK, 0 rows affected (0.17 sec)Records: 0 Duplicates: 0 Warnings: 0

接下来再来看另一条 sql,看看结果又是怎样的。

mysql> explain select a from t where a>100 or b>6000;+----+-------------+-------+------+-----------------+------+---------+------+--------+-------------+| id | select_type | table | type | possible_keys  | key | key_len | ref | rows  | Extra    |+----+-------------+-------+------+-----------------+------+---------+------+--------+-------------+| 1 | SIMPLE   | t   | ALL | a_index,b_index | NULL | NULL  | NULL | 100332 | Using where |+----+-------------+-------+------+-----------------+------+---------+------+--------+-------------+1 row in set (0.00 sec)

其实在 mysql 中很多东西都是不绝对的,对于同一条 sql 不同 mysql 版本的内部处理方式有可能是不太一样的,同时也可以看到 mysql 一直在不断优化升级,一些老旧的知识点很容易就会不再适用了。

希望文章对你有帮助,欢迎关注,点个赞是对我最好的支持,感谢。

另外,关于 mysql 的底层数据结构,大家可以参考我前面写的其他文章,对你理解这篇文章或许有帮助。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

更多相关文章

  1. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  2. [android源码下载索引贴】微信+二维码那都不是事......
  3. android中json文件的写法
  4. Android(安卓)UI控件详解-Button(按钮)点击事件的5种写法
  5. android触控,先了解MotionEvent
  6. 系出名门 Android(安卓)系列文章索引
  7. android自定义属性
  8. 系出名门 Android(安卓)系列文章索引
  9. 系出名门 Android(安卓)系列文章索引

随机推荐

  1. android studio 模拟器出现中文乱码解决
  2. Android遇到 android studio "Internal H
  3. Android 2.2 Platform
  4. 在编译Android时,开机不锁屏
  5. android 短信是否发送成功
  6. Android   收集索引贴
  7. Android电话秀(二)
  8. Android计算缓存大小、清空缓存
  9. Android取消EditText自动获取焦点
  10. Android开发中Android与网页(JavaScrip)t的