关于Mysql索引的问题
CREATE TABLE `tieba` ( `id` int(10) NOT NULL AUTO_INCREMENT, `url` char(32) DEFAULT NULL, name varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `url_index` (`url`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8如上面这张表,在url上建了索引,name上没有索引
我是用下面的语句会用索引进行优化查询吗
select * from tieba where url=? and name=?
我看了Mysql5.1的官方文档,里面有一句话是这样的
“任何不跨越WHERE子句中的所有AND级的索引不用于优化查询。”
参见: http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#indexes
如果按照这种说法,这条语句是不会使用索引优化查询?
如果我给name加上索引,还是上面这条语句,那么它会使用索引吗,如果是,
是使用其中一个还是2个都使用?我的理解是使用其中一个,Mysql会判断哪个索引取出
来的数据数量较小
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。
对,所有的and要是联合索引的子集,而且按顺序,就是前缀原则嘛
我感觉其实你是懂的mysql的索引机制的,说白了就是索引前缀原则。
你纠结的就是翻译问题,英文原文是这么表述的:
Any index that does not span all AND levels in the WHERE clause is not used to optimize the query. In other words, to be able to use an index, a prefix of the index must be used in every AND group.
其实从翻译角度来说最关键的是,看你如何理解span这个词,ZH版直译为跨越,就让中国人比较费解了。个人理解:英文中的span指的是一个连续的跨度,此处也指一个连续的跨度,就是说一个索引没有在一个连续的跨度上包含所有and级别的where子句的话是无法优化这个查询的。所以你说翻译的有问题,我觉得也可以这么说……
似乎明白了,就是有一个联合索引(col1,col2,col3),你的where查询条件里的字段,合并起来一定要符合(col1,col2,col3),(col1,col2),(col1)这三种形式中的一个,索引才会生效
回复
果断正解,O(∩_∩)O哈哈~
我感觉其实你是懂的mysql的索引机制的,说白了就是索引前缀原则。
你纠结的就是翻译问题,英文原文是这么表述的:
Any index that does not span all AND levels in the WHERE clause is not used to optimize the query. In other words, to be able to use an index, a prefix of the index must be used in every AND group.
其实从翻译角度来说最关键的是,看你如何理解span这个词,ZH版直译为跨越,就让中国人比较费解了。个人理解:英文中的span指的是一个连续的跨度,此处也指一个连续的跨度,就是说一个索引没有在一个连续的跨度上包含所有and级别的where子句的话是无法优化这个查询的。所以你说翻译的有问题,我觉得也可以这么说……
这个我知道
select * from tieba where url=? and name=? 会使用
select * from tieba where name=? and url=?不会使用。
小学语文:
任何不跨越WHERE子句中的所有AND级的索引不用于优化查询。
相当于
任何跨越WHERE子句中的所有AND级的索引用于优化查询。
意思是,同时有url + name的组合索引,将用于优化查询 -这个很合理吧,文档没有翻译错。
至于url这个单列索引,会否用于查询中,这个并不是文档中这句来说明的,应该另外还有其它文字描述。
你引用的的文档里说的是多列索引,现在你是在url列上建的单列索引
所以文档里说的没错,你explain出的结果也没错。
如果你同时在url和name列上各建了一个单列索引的话,一般只会用到其中一个,但是mysql的查询优化器有一个index merge的功能,如果开启这个功能的话情况可能不一样。
关于mysql 的index merge就请google吧!
用explain试过了,可以起作用的,难道是文档翻译错了,呵呵……
应该不会使用 ,多插几个数据 ,用 explain 试下就知道了