我在 MySQL 中查询一个非常大的表(超过 300 万条记录),它有一个 category_id、subcategory_id 和邮政编码。zip 在数据库中可能是也可能不是 10 个字符。
目的是获取指定 zip 特定半径内的所有 cat/subcat 项目。我有一个函数,它返回一个指定的 5 位 zip 列表。然后将此列表输入到我的查询中,就像这样......
SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND LEFT(zip,5) IN (11111,22222,33333,44444,55555)
Run Code Online (Sandbox Code Playgroud)
我在 cat_id、subcat_id 和 zip 上有一个复合索引,但在某些情况下 10 个字符的 zip 可能会被丢弃。我可以以某种方式索引 LEFT(zip,5) 吗?
直接回答您的问题:是的,您可以索引 left(zip, 5)。
alter table tblName add index (zip(5));
Run Code Online (Sandbox Code Playgroud)
如果您希望查询能够使用索引来搜索所有列:
alter table tblName add index (cat_id, subcat_id, zip(5));
Run Code Online (Sandbox Code Playgroud)