我有一个包含错误索引的表,我正在构建一个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忽略该列中搜索的内容(如果可能的话)?
答案 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'
答案 2 :(得分:0)
我觉得你可能想要这个。如果没有,我们会重新考虑: - )
select * from members where 1 and lname LIKE '%' and fname = 'Ryan' limit 30