MySQL索引在字符串的第一部分

时间:2011-09-21 22:23:37

标签: mysql indexing

我在MySQL中查询一个包含category_id,subcategory_id和zipcode的非常大的表(超过3M记录)。 zip中的zip可能是也可能不是10个字符。

目的是获取指定zip的某个半径内的所有cat / subcat项目。我有一个函数返回一个指定的5位拉链列表。然后将此列表提供给我的查询,如此...

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND LEFT(zip,5) IN (11111,22222,33333,44444,55555)

我在cat_id,subcat_id和zip上有一个复合索引,但在某些情况下,zip为10个字符可能会将其丢弃。我能以某种方式索引LEFT(zip,5)吗?

4 个答案:

答案 0 :(得分:4)

直接回答你的问题:是的,你可以索引左(zip,5)。

alter table tblName add index (zip(5));

如果您希望查询能够使用索引搜索所有列:

alter table tblName add index (cat_id, subcat_id, zip(5));

答案 1 :(得分:1)

你应该有一个包含普通5位数zip和列的列,其中包含所有额外数字,让SQL正常处理它。有些方法可以做你所说的,但这是迄今为止最有效的解决方案。

答案 2 :(得分:1)

如果要使用索引,请将查询更改为:

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND (   zip LIKE '11111%'
     OR zip LIKE '22222%'
     OR zip LIKE '33333%'
     OR zip LIKE '44444%'
     OR zip LIKE '55555%')

另一种选择是对表进行非规范化(应该是最后一个选项)并添加一个额外的字段,其中包含zip中最左边的5个字符。 然后你可以这样做:

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND LEFTzip5 IN (11111,22222,33333,44444,55555)

不要忘记在字段leftzip5上添加索引。

答案 3 :(得分:0)

我真的怀疑你只能索引Zip的LEFT(5),但如果你有可能,我会在桌面上创建一个额外的列并用ZIP的LEFT(5)更新它然后我会将该列索引到提高我的表现