mysql数据库,innoDB引擎,字段a和b都加了索引,select * from table where a=1 and b=2,这条查询语句,数据库去表中筛选数据的具体过程是怎样的?
为什么只有字段a的索引能用得上,字段b上的索引用不上?、
字段a和字段b非主键
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
我们知道,数据库查询是数据库的最主要功能之一,例如下面的SQL语句:
SELECT * FROM my_table WHERE col2 = '77'
可以从表“my_table”中获得“col2”为“77”的数据记录。
我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),遍历“my_table”然后逐行匹配“col2”的值是否是“77”,这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
我理解的过程,因为数据库是mysql,引擎是innoDB,BTREE索引,那么就是聚集性索引了,用主键索引查的话,能直接查找到数据本身,辅助索引查的话,只能查到对应的主键,需要再根据主键来查找数据;
字段a和字段b非主键,where a = 1 and b = 2,根据a来筛选按照辅助索引可以查到几个主键,然后根据这些主键按照主键索引去查询时候,查询到叶子结点能直接查询到整条数据,在这时候去比对b的值是否为2,如果等于2则返回回去。
因此只用了字段a上加的索引,字段b上加的索引用不上。
以上是我的理解,不知道对不对。
新华字典用过吧,数据库就好比是一本字典,索引呢就是目录,没有目录的话,想找到一个字也是可以的,就是比较费劲而已
我通常可以通过拼音或者部首去查一个字,那就等同于字典给我们提供了在拼音和部首上定义的索引
比如我们找‘赵’这个字,在没有索引的情况下,只能从第一个字开始找,(因为字典本身是按照拼音顺序排版的,所以直接翻字典也算是使用索引,那么我们假设一本字典,里面的文字是乱序的)然后一直找到我们需要的字为止,这个行为叫full scan(全表扫描)
如果通过目录,也就是索引来找,我们只要在目录里找到这个字,然后根据它后面的页码就能找到这个字的全部信息了
之前也有过这样的问题,然后通过explain测试,得到了些东西。分享给楼主。
备注:至于那个一定量的数据,我不知道是多少,但和表的数据总量应该也有关系。这种情况是建立在索引类型为Normal,索引方法为BTREE的情况下。
通过索引去查询都是半分法的方式。