博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】数据库中查询记录时是否每次只能使用一个索引?
阅读量:7095 次
发布时间:2019-06-28

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

疑问:

在网上看一些文章的时候,发现好几次下面这样的话:

如果经常需要同时对两个字段进行AND查询,那么使用两个单独索引不如建立一个复合索引,因为两个单独索引通常数据库只能使用其中一个,而使用复合索引因为索引本身就对应到两个字段上的,效率会有很大提高。

但是,往往都没有说为什么?想知道以下问题:

1、是不是在任何情况下数据库查询一次只会使用到一个索引
2、如果不是,那么什么情况下只会使用一个索引
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查找。

 

from:https://segmentfault.com/q/1010000003880137/a-1020000008232810

 

转载地址:http://bbaql.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
svn搭建
查看>>
查看Apache并发请求数及其TCP连接状态解释 [转载--张宴]
查看>>
apache+svn服务搭建
查看>>
自定义tabBar中间的添加按钮
查看>>
docker php-fpm默认镜像安装 php扩展
查看>>
素数伴侣
查看>>
nginx从入门到实践
查看>>
C++_封装弹出文件夹选择框
查看>>
pdf首页封面的抓取
查看>>
记一次windows 2003被黑
查看>>
samba配置文件
查看>>
Android 里的各种通信方式(四)
查看>>
从用户的视角看待网页设计(四)
查看>>
IPv6 中国已经开始了,RFC中文翻译急需
查看>>
实验室系统扫描录样需求
查看>>
私有git 搭建
查看>>
tensorflow 基础学习
查看>>
解析MySQL binlog --(2)FORMAT_DESCRIPTION_EVENT
查看>>
【更新】超文本打印编辑工具TRichView V16.15发布 | 附下载
查看>>