如何正确的使用索引 mysql索引怎么实现( 三 )


方法同上,可以确定a=1,b=5的记录在{1,1,1}和{1,5,1}的关联范围内,搜索过程与a=1的相似 。
查询b=1的记录 。
在这种情况下,通过P1页中的记录,无法判断b=1的记录在那些页中 。我们只能锁定索引树的所有叶节点,遍历所有记录,然后进行筛选 。此时,索引无效 。
根据c的值查询 。
这种情况和查询b=1一样,只能扫描所有叶子节点,此时索引无效 。
按B和c一起查 。
这种索引也不能用,只能扫描所有数据,此时索引无效 。
按两个字段查询[a,c]
这只能在索引的A字段中使用 。通过A确定索引范围,然后加载与A关联的所有记录,然后过滤C的值..
查询a=1,b>=0,c=1的记录 。
这种情况下,只能先确定a=1且b>=0的页面所在的范围,然后才能遍历这个范围内的所有页面 。在这个查询的过程中,无法确定C的数据在哪些页面 。此时我们称C不索引,只有A和B能有效确定索引页面的范围 。
类似的还有>,,alter table test 1 modify id int not null主键;查询正常,0行受影响(10.93秒)记录:0重复:0警告:0mysql >显示test1的索引;---------------------------------------------------------------------------------------------------------------------------------------------------------// h/]| 1/]| test1 | 0 | PRIMARY | 1
id设置为主键后,会在ID上建立一个聚集索引,任意一个都会被检索到 。我们来看看效果:
mysql> select * from test1其中id = 1000000--| id | name | sex | email |--| 1000000 | javacode 1000000 | 2 | javacode1000000@163.com |-集合中的一行(0.00秒)
这个非常快,这个采用了上面描述的‘唯一记录检索’ 。
在和范围之间搜索
mysql >从test1中选择count(*),其中id介于100和110之间;-| count(*)|-| 11 |-集合中的1行(0.00秒)
也很快,id上有主键索引 。上面介绍的范围搜索可以快速定位目标数据 。
但是,如果范围太大,跨页太多,速度会比较慢,如下:
MySQL > select count(*)from test1,其中id介于1和2000000之间;-| count(*)|-| 2000000 |-集合中的一行(1.17秒)
上述id的值跨度太大 。1所在的页面和200万所在的页面之间要读的页面很多,所以比较慢 。
所以在使用between和的时候,区间跨度不能太大 。
在中检索
我们仍然经常使用in来检索数据 。
通常我们做项目的时候,建议少用表连接 。比如在电子商务中,如果需要查询订单信息和订单中商品的名称,可以先查询订单表,然后从订单表中取出商品的id列表,通过in的方式从商品表中检索商品信息 。因为商品id是商品表的主键,所以检索速度还是比较快的 。
按id从400万条数据中检索100条数据,看效果:
mysql> select * from test1 a其中a.id in (100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014 100071, 100072, 100073, 100074, 100075, 100076, 100077, 100078, 100079, 100080, 100081, 100082, 100083, 100084, 100085, 100086, 100087, 100088, 100089, 100090, 100091, 100092, 100093, 100094, 100095, 100096, 100097, 100098, 100099);---| id | name | sex | email |--100000 | javacode 100000 | 2 | javacode100000@163.com || 100001 | javacode 100001 | 1 | javacode100001@163.com || 100002 | javacode 100002 | 2 | javacode100002@163.com |.......| 100099 | javacode 100099 | 1 | javacode100099@163.com |-集合中的100行(0.00秒)
用时不到1毫秒,还是挺快的 。
这相当于搜索多个唯一的记录,然后合并这些记录 。
有多个索引时如何查询?
让我们分别对姓名和性别字段建立索引 。
mysql >在test1(name)上创建索引idx1查询正常,0行受影响(13.50秒)记录:0重复:0警告:0mysql >在test1(sex)上创建索引idx2查询正常,0行受影响(6.77秒)记录:0重复项:0警告:0

推荐阅读