1

我有一个索引错误的表,我正在构建一个 php 页面,您可以在其中填写任何字段,它会根据填写的内容为您提供结果。这是我要运行的查询。问题是没有索引只是fname

select * from members where 1 and fname = 'Ryan' limit 30

为了让我的查询使用索引,我需要添加lname到查询中。我不知道的是如何在不做任何事情的情况下添加它(如果可能的话)。

select * from members where 1 and lname = '{ANYTHING}' and fname = 'Ryan' limit 30

我用作{ANYTHING}占位符来表示任何值。这样做将使用索引,但我如何告诉 mysql 忽略该列中的搜索内容(如果可能)?

4

3 回答 3

2

如果您的索引已打开(lname,fname)并且您不知道lname,那么该索引对于您正在执行的查询类型基本上是无用的。

如果您考虑一下,这是有道理的 - 索引首先lnamefname. 如果不扫描整个事物,就lname无法在索引中找到给定的值,这当然违背了首先使用索引的目的。fname

这就像在电话簿中找到所有 Johns 或 Eric(按姓氏然后名字“索引”)。没有姓氏,知道名字是没有用的,或者至少不比扫描整个电话簿更好。

此外,来自这里的 MySQL 文档的参考

如果列不构成索引的最左前缀,则 MySQL 不能使用索引。假设您有此处显示的 SELECT 语句:

SELECT * FROM tbl_name WHERE col1=val1;

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

SELECT * FROM tbl_name WHERE col2=val2;

SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

如果 (col1, col2, col3) 上存在索引,则只有前两个查询使用该索引。第三和第四个查询确实涉及索引列,但是 (col2) 和 (col2, col3) 不是 (col1, col2, col3) 的最左边的前缀。

于 2013-06-24T20:24:50.717 回答
0
SELECT * FROM members WHERE lname is not null AND fname = 'Ryan'

http://sqlfiddle.com/#!2/2ef93/3

于 2013-06-24T20:06:58.240 回答
0

我立刻想你可能想要这个。如果不是,我们会重新考虑:-)

select * from members where 1 and lname LIKE '%' and fname = 'Ryan' limit 30
于 2013-06-24T20:09:19.963 回答