mysql只会使用到一个索引的原因
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
其中column1,column2 ,column3分别单独建立了3个单索引。
与其说是“数据库查询只能用到一个索引”,倒不是说是 和全表扫描/只使用一个索引的速度比起来,去分析两个索引二叉树更加耗费时间,所以绝大多数情况下数据库都是是用一个索引。
如这条语句:
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
我们来想象一下当数据库有N个索引并且查询中分别都要用上他们的情况:
查询优化器(用大白话说就是生成执行计划的那个东西)需要进行N次主二叉树查找[这里主二叉树的意思是最外层的索引节点],此处的查找流程大概如下:
查出第一条column1主二叉树等于1的值,然后去第二条column2主二叉树查出foo的值并且当前行的coumn1必须等于1,最后去column主二叉树查找bar的值并且column1必须等于1和column2必须等于foo。
如果这样的流程被查询优化器执行一遍,就算不死也半条命了,查询优化器可等不及把以上计划都执行一遍,贪婪算法(最近邻居算法)可不允许这种情况的发生,所以当遇到以下语句的时候,数据库只要用到第一个筛选列的索引(column1),就会直接去进行表扫描了。
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
所以与其说是数据库只支持一条查询语句只使用一个索引,倒不如说N条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢。
所以如上条的情况,最佳推荐是使用index(column1,column2,column3) 这种联合索引,此联合索引可以把b+tree结构的优势发挥得淋漓尽致:
一条主二叉树(column=1),查询到column=1节点后基于当前节点进行二级二叉树column2=foo的查询,在二级二叉树查询到column2=foo后,去三级二叉树column3=bar查找。
相关文章
- 使用nexus搭建一个docker私服
- flink中使用lambda表达式
- 使用flink实现一个简单的wordcount
- docker搭建rabbitmq集群
- docker multi-stage 多阶段构建
- docker run 的基本用法
- 使用registry搭建docker私服仓库
- zip和flatMap没有生效
- centos7上安装Docker
- 莱特币(LTC)开发环境搭建
- netty中使用protobuf实现多协议的消息
- proto3语法记录
- redis5集群搭建步骤
- 将博客搬至CSDN
- nio之缓冲区(Buffer)理解
- netty实现websocket发送文本和二进制数据
- springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
- RabbitMQ的一些理解和笔记
- springboot 整合 rabbitmq
- spring整合rabbitmq