使用列,但忽略列中的数据

时间:2013-06-24 20:00:19

标签: mysql

我有一个包含错误索引的表,我正在构建一个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忽略该列中搜索的内容(如果可能的话)?

3 个答案:

答案 0 :(得分:2)

如果您的索引位于(lname,fname)并且您不知道lname,那么索引对您正在进行的查询类型基本上没用。

如果您考虑一下,这是有道理的 - 索引首先由lname然后由fname排序。如果没有lname,就无法在索引中找到给定的fname,而无需扫描整个事物,这当然会破坏首先使用索引的目的。

这就像找到电话簿中的所有Johns或Erics一样(通过姓氏然后用名字“索引”)。没有姓氏,知道名字是无用的,或者至少没有比扫描整本电话簿更好。

另外,来自here

的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)。

答案 1 :(得分:0)

SELECT * FROM members WHERE lname is not null AND fname = 'Ryan'

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

答案 2 :(得分:0)

我觉得你可能想要这个。如果没有,我们会重新考虑: - )

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