我在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)吗?
答案 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)更新它然后我会将该列索引到提高我的表现