数据库查询索引(sql单个索引和复合索引)http://www.bieryun.com/3380.html

当一条sql语句的查询涉及到多个字段,这个时候给每个字段加索引,数据库也只能够使用其中的一个索引,这个时候使用复合索引就比较好了。这是为什么呢?

这是因为:全表扫描/只使用一个索引的速度比起来,去分析两个索引二叉树更加耗费时间,所以绝大多数情况下数据库都是是用一个索引。
如这条语句:

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查找。

数据库查询索引(sql单个索引和复合索引)相关推荐

  1. 数据库查询语句SQL中like、%、-的区别

    数据库查询语句SQL中like.%.-的区别 数据库查询语句SQL中like.%.-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k& ...

  2. Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、

    Pandas把dataframe的索引.复合索引变换为数据列:包含单索引到单列(重命名).复合索引到多数据列.复合索引的其中一个水平变换为数据列 目录

  3. Python之pandas:对dataframe数据的索引简介、应用大全(输出索引/重命名索引列/字段去重/设置复合索引/根据列名获取对应索引)、指定某字段为索引列等详细攻略

    Python之pandas:对dataframe数据的输出索引.重命名索引列/字段去重/设置复合索引/根据列名获取对应索引.指定某字段为索引列等详细攻略 目录 对pandas中dataframe数据中 ...

  4. mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例

    上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...

  5. oracle复合索引的使用方法,ORACLE复合索引使用 注意事项

    复合索引的第一列一定要出现在WHERE子句中. 一.like "%_" 百分号在前. 二.WHERE中单独引用复合索引里第一位置的索引列,并且SELECT.GROUP BY等子句中 ...

  6. mysql复合索引的应用场景_mysql复合索引(联合索引)的使用场景

    什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...

  7. oracle alter增加索引,sql – Oracle alter index允许索引空值

    你现在至少有四种选择: >创建"常量表达式"索引- create index half_null_col_idx on huge_table (half_null_col, ...

  8. oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析

    本文由读者小平同志投稿,小平是一位非常朴实认真的猿,现于某上市证券公司做微服务开发,对 MySQL 优化有深入研究,小平的博客地址是https://blog.csdn.net/weixin_41193 ...

  9. oracle复合索引介绍(多字段索引)

    首先,在大多数情况下,复合索引比单字段索引好.以税务系统的SB_ZSXX(申报类_征收信息表)为例,该表为税务系统最大的交易表.如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中 ...

最新文章

  1. Redis进阶-Redis安全相关操作
  2. 软件工程软件开发成本度量规范_软件开发成本度量方法
  3. python对文件进行读写操作
  4. QT - 内存泄漏检测
  5. 实用的编程网站—良好的开端
  6. Win11系统怎样设置更改密码
  7. PostgreSQL数据库配置网络访问
  8. setTimeout(〒︿〒) 请原谅我一直以来对你的忽视
  9. java文件写入blob_java程序向IQ写入blob(image)类型数据问题的解决
  10. Pr 视频效果:颜色校正
  11. 硬盘整数大小分区问题
  12. 学习opencv3 pdf_PDF的虚拟打印机,免费又好用
  13. 分享27个高质量前端大佬的油管频道(上)
  14. PWM控制电机转速、PWM原理
  15. 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话
  16. MATLAB冒号表达式
  17. 专访马云:下一个星辰大海是百货商店
  18. 考研复试英语自我介绍模版
  19. html5 a4页面,如何在A4纸张尺寸页面制作HTML页面?
  20. 外星人装Ubuntu18.04

热门文章

  1. Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
  2. dotnetNuke module development steps, dnn 模块开发步骤
  3. Select prototyping tools
  4. 欧姆龙修复PLC编程软件中的多个高危漏洞
  5. Firefox 97.0.2 修复两个已遭利用的0day
  6. 黑客恶意修改化学成分参数,远程投毒饮用水
  7. dubbo项目引用另一个项目的接口
  8. nodejs pm2的简单应用
  9. 面向对象程序设计的4个主要特点
  10. 音效SystemSoundID