数据库查询索引(sql单个索引和复合索引)

原文链接:https://yq.aliyun.com/articles/584977

数据库查询索引(sql单个索引和复合索引)

当一条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查找。

原文地址http://www.bieryun.com/3380.html

展开阅读全文
博主设置当前文章不允许评论。

组合索引单个索引的问题

04-20

[code=SQL]rn SQL Statement from editor:rn rn rn select c0602 "商品编码",c0625 "商品条码",rn c0103 "商品名称",c0104 "规格",c0604 "配货件数",rn c0605 "配货数量",c0618 "计划赠品数",c0606 "实际出库数",rn c0621 "出库赠品数",c0610 "门店实收数",c0611 "实收赠品数",rn c0609 "剩余商品入库",c0622 "剩余商品报损" rn from c05 t1,c06,vc01 where c0501=c0601 and c0602=c0101 rn and c0538rn between to_date('2009.1.1','yyyy-mm-dd') and to_date('2009.2.28','yyyy-mm-dd') rn ------------------------------------------------------------rn rn Statement Id=7 Type=TABLE ACCESSrn Cost=5 TimeStamp=20-04-10::16::21:23rn rn (1) SELECT STATEMENT CHOOSE rn Est. Rows: 23,043 Cost: 6,193rn (11) MERGE JOIN rn Est. Rows: 23,043 Cost: 6,193rn (8) SORT JOIN rn Est. Rows: 23,043 Cost: 1,366rn (7) MERGE JOIN rn Est. Rows: 23,043 Cost: 845rn (3) TABLE ACCESS BY INDEX ROWID FZDC.C06 [Analyzed] rn (3) Blocks: 34,464 Est. Rows: 2,411,508 of 2,411,508 Cost: 826 rn Tablespace: FZ_DATrn (2) NON-UNIQUE INDEX FULL SCAN FZDC.IND_C0601 [Not Analyzed] rn Est. Rows: 2,411,508 Cost: 26rn (6) SORT JOIN rn Est. Rows: 668 Cost: 19rn (5) TABLE ACCESS BY INDEX ROWID FZDC.C05 [Analyzed] rn (5) Blocks: 7,944 Est. Rows: 668 of 406,159 Cost: 5 rn Tablespace: FZ_DATrn (4) NON-UNIQUE INDEX RANGE SCAN FZDC.IND_C05_C0538 [Not Analyzed] rn Est. Rows: 1 Cost: 2rn (10) SORT JOIN rn Est. Rows: 305,274 Cost: 4,827rn (9) TABLE ACCESS FULL FZDC.C01 [Analyzed] rn (9) Blocks: 10,492 Est. Rows: 305,274 of 305,274 Cost: 1,594 rn Tablespace: FZ_DATrnrn[/code]rnrnc0601 c0602 分别建一个索引好呢。。。还是建一个组合索引好呢?就本题 论坛

mysql 索引是否可以去掉几个?复合索引

06-26

[code=sql]rnCreate Table: CREATE TABLE `zz_info` (rn `tid` int(11) NOT NULL AUTO_INCREMENT,rn `title` varchar(255) NOT NULL COMMENT '标题',rn `uid` int(11) NOT NULL DEFAULT '0' COMMENT 'UID',rn `c1` int(11) NOT NULL DEFAULT '0' COMMENT '类目1',rn `c2` int(11) NOT NULL DEFAULT '0' COMMENT '类目2',rn `c3` int(11) NOT NULL DEFAULT '0' COMMENT '类目3',rn `d1` int(11) NOT NULL DEFAULT '0' COMMENT '地区1',rn `d2` int(11) NOT NULL DEFAULT '0' COMMENT '地区2',rn `d3` int(11) NOT NULL DEFAULT '0' COMMENT '地区3',rn `addtime` int(11) NOT NULL COMMENT '发布时间',rn `uptime` int(11) NOT NULL COMMENT '更新时间',rn `status` smallint(6) NOT NULL DEFAULT '1' COMMENT '信息状态,默认1显示中',rn PRIMARY KEY (`tid`),rn KEY `idx-info-uid` (`uid`),rn KEY `idx-info-c1` (`c1`),rn KEY `idx-info-c2` (`c2`),rn KEY `idx-info-c3` (`c3`),rn KEY `idx-info-d1` (`d1`),rn KEY `idx-info-d2` (`d2`),rn KEY `idx-info-d3` (`d3`),rn KEY `idx-info-status` (`status`),rn KEY `uptime` (`uptime`),rn KEY `idx-info-status-c2` (`status`,`c2`),rn KEY `idx-info-status-d1` (`status`,`d1`),rn KEY `idx-info-status-c1` (`status`,`c1`),rn KEY `idx-info-status-d2` (`status`,`d2`),rn KEY `idx-info-status-c2-d2` (`status`,`c2`,`d2`)rn) ENGINE=InnoDB AUTO_INCREMENT=16538560 DEFAULT CHARSET=utf8rn/*!50100 PARTITION BY HASH (tid)rnPARTITIONS 10 */rn1 row in set (0.00 sec)rn[/code]rnrn以上一个数据表, idx-info-d1 与 idx-info-status-d1 是否有重复?是否是在 idx-info-status-d1 中包含了 idx-info-d1?rnrn会出现以下几类查询SQL:d1单独查询、d2单独查询、d1与status组合、d2与status组合、d2+c2+status 组合、c1+status、c2+statusrnrnrn 论坛

没有更多推荐了,返回首页