
benluobobo02-11 15:19
等级
3楼
如果要了解具体的存储方式,建议先了解一下数据存储格式,假设是innodb
执行如下语句
createtablesecondindextest(aint,bint);
createindexix_a_bonsecondindextest(a,b);
insertintosecondindextestselect1,1;
insertintosecondindextestselect1,2;
insertintosecondindextestselect2,1;
insertintosecondindextestselect2,2;
在来看看具体的数据是如何存储的,打开secondindextest.ibd文件,找到索引页,如下数据
8000000180000001000001578B080000
00180014800000018000000200000157
8B090000002000148000000280000001
000001578B0A00000028FFB680000002
80000002000001578B0B000000000000
0000
看其中的8000000180000001就是索引的第一行1,1,这个80代表的是带符号的

后面带的000001578B08000000180014包括了主键的位置以及下一行的偏移量等信息
往后看,可以看到8000000180000002
8000000280000001
8000000280000002
分别代表了(1,2),(2,1),(2,2)
你所问的存放问题实际上就是跟着第一列继续放
联合索引(复合索引)和单个索引
weinanbu02-11 15:51
等级
4楼
比如我想找(2,1)那么首先会找到第一列等于2的那么找到了两个(2,1),(2,2),我想知道在找到第一列后,是如何找到第二列的,是一个一个找还是第二列也做了排序?怎么排的序?
如果是建两个单列列索引,那就是分别查找两棵树,最后取rowid的交集是吗?
我是小白,求解释的细一点,谢谢了
mysql(三)复合索引中列的顺序怎么选择提供性能
benluobobo02-11 15:57
等级
5楼
1第二列也做了排序,首先根据第一列排序,在第一列一样的情况下,第二列再排序
2一个查询只能使用一个索引,不存在你说的分别查找两棵树的情况
关于创建含null值索引与含null值的复合索引

weinanbu02-11 16:16
等级
6楼
SELECT*FROMTABLE1WHEREA=22ANDb=33;也就是说我见了两个单列索引,只能用索引a?
MySQL索引原理(b+树)
benluobobo02-11 16:35
等级
7楼
用哪个索引是查询器决定的
也可以用forceindex强制使用索引
ArrayList的底层实现原理
mchdba02-11 21:44
等级
8楼
始终是一棵树的,只是构成树的叶子节点的数据从一列变成两列,而且叶子节点数也变多了。
关于索引的理解(实践总结)
ACMAIN_CHM02-11 22:45
等级
9楼
引用楼主weinanbu的回复:比如mysql单列索引是将该列数据当做关键字构建一颗b+tree基于hash表的索引结构设计与实现,但是组合索引是如何实现的呢?比如两个字段的组合索引,SELECT*FROMTABLE1WHEREA=22ANDb=33;是要建两棵树吗?如果只建立一颗树,那b列是如何存放的?
A=22ANDb=33
你假设一下C=A*10000+B,然后根据C做BTREE。后面的所以搜索一切就容易了。其实就是相同的原理。以A先放,A相同的情况下按B的顺序放。

Redis的数据结构—1.简单介绍,序集合SortedSet的实现,跳表的实现
weinanbu02-12 10:16
等级
10楼
引用9楼ACMAIN_CHM的回复:Quote: 引用楼主weinanbu的回复:
比如mysql单列索引是将该列数据当做关键字构建一颗b+tree,但是组合索引是如何实现的呢?比如两个字段的组合索引,SELECT*FROMTABLE1WHEREA=22ANDb=33;是要建两棵树吗?如果只建立一颗树,那b列是如何存放的?
A=22ANDb=33
你假设一下C=A*10000+B,然后根据C做BTREE。后面的所以搜索一切就容易了。其实就是相同的原理。以A先放,A相同的情况下按B的顺序放。
你的意思是将每一行的A、B值hash成C,然后用C构建B-Tree,当我在查询A=22ANDb=33
的时候,先将AB的值转成C=22*10000+33,之后再在B-tree里找c,而c保存了A=22ANDb=33的数据的地址,是这个意思吗?
通过sumif函数,将a工作薄sheet2的数据求和至当前工作薄需要就和的列 在 a工作薄sheet2 中的d列, b列为条件区域.根据当前工作薄sheet1中d5列信息,到a工作薄sheet2的b列中查找满足条件的数据,然后将d列数据相加并记录到当前工作薄的l列中.自己写的这段程序...通过sumif函数,将a工作薄sheet2的数据求和至当前工作薄。f2列的公式意义:查找满足d列小于20,c列大于10两个数集的交集中数字个数(或者理解为该值即在c列中存在,又在d列中存在,同时大于10,小于20的值个数)。在表格中,纵向的我们叫列,顾名思义,纵向查找即为按列查找,最终返回所需查询列对应的值。
复合索引顺序
wmxcn200002-12 10:32
等级
11楼
一个索引,创建一个树,也只能创建一个树,不管是单列,还是多列联合。
如果是联合索引基于hash表的索引结构设计与实现,第二列也会放在第一列后面。
假定有一张表
create table t (c1 int , c2 int , c3 int , int)
场景1

create index t_ix1 on t(c1) ;
create index t_ix2 on t(c2) ;
此时,你执行
select * from t where c1 = 100 -- 会用到 t_ix1
select * from t where c2 = 100 -- 会用到 t_ix2
select * from t where c1 = 100 and c2 = 100 -- 只能用到 t_ix1 和 t_ix2 中的一个。
场景2
create index t_ix1 on t(c1 ,c2)
create index t_ix2 on t(c2)
你再执行
select * from t where c1 = 100 -- 会用到 t_ix1
select * from t where c2 = 100 -- 会用到 t_ix2 ,如果没有 t_ix2 ,就会全表扫描
select * from t where c1 = 100 and c2 = 100 -- 会用到 t_ix1
另,条件中的各个语句在顺序上,不会影响执行计划
select * from t where c1 = 100 and c2 = 100
select * from t where c2 = 100 and c1 = 100
优化之复合索引不起作用的原因
xiwei_gao02-04 13:05
等级
12楼
另,条件中的各个语句在顺序上,不会影响执行计划
select * from t where c1 = 100 and c2 = 100
select * from t where c2 = 100 and c1 = 100
第二句不会用到复合索引吧?
java面试之HashMap的实现原理和底层数据结构
abcdefghiijklmnopqrs03-07 14:43
等级
13楼
引用10楼weinanbu的回复:Quote: 引用9楼ACMAIN_CHM的回复:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-107248-1.html
中国捍卫自身主权和海洋权益的立场坚定不移