关于Mysql索引的问题

发布于 2021-11-17 17:29:29 字数 890 浏览 844 评论 12


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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

猫性小仙女 2021-11-24 07:13:10

mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。

网名女生简单气质 2021-11-24 07:13:06

对,所有的and要是联合索引的子集,而且按顺序,就是前缀原则嘛

风苍溪 2021-11-24 07:12:55

我感觉其实你是懂的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子句的话是无法优化这个查询的。所以你说翻译的有问题,我觉得也可以这么说……

乞讨 2021-11-24 07:12:12

似乎明白了,就是有一个联合索引(col1,col2,col3),你的where查询条件里的字段,合并起来一定要符合(col1,col2,col3),(col1,col2),(col1)这三种形式中的一个,索引才会生效

左岸枫 2021-11-24 07:11:53

回复
果断正解,O(∩_∩)O哈哈~

冷弦 2021-11-24 07:09:09

我感觉其实你是懂的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子句的话是无法优化这个查询的。所以你说翻译的有问题,我觉得也可以这么说……

小情绪 2021-11-24 07:07:59

这个我知道

虐人心 2021-11-24 06:59:56

select * from tieba where url=? and name=? 会使用

select * from tieba where name=? and  url=?不会使用。

恋你朝朝暮暮 2021-11-24 03:06:41

小学语文:

任何不跨越WHERE子句中的所有AND级的索引不用于优化查询。

相当于

任何跨越WHERE子句中的所有AND级的索引用于优化查询。

意思是,同时有url + name的组合索引,将用于优化查询 -这个很合理吧,文档没有翻译错。

至于url这个单列索引,会否用于查询中,这个并不是文档中这句来说明的,应该另外还有其它文字描述。

飘过的浮云 2021-11-23 07:26:43

你引用的的文档里说的是多列索引,现在你是在url列上建的单列索引

所以文档里说的没错,你explain出的结果也没错。

如果你同时在url和name列上各建了一个单列索引的话,一般只会用到其中一个,但是mysql的查询优化器有一个index merge的功能,如果开启这个功能的话情况可能不一样。

关于mysql 的index merge就请google吧!

落墨 2021-11-22 07:54:17

用explain试过了,可以起作用的,难道是文档翻译错了,呵呵……

绝情姑娘 2021-11-18 17:12:08

应该不会使用 ,多插几个数据 ,用 explain  试下就知道了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文