【发布时间】:2011-09-21 22:23:36
【问题描述】:
我在 MySQL 中查询一个非常大的表(超过 3M 条记录),其中包含 category_id、subcategory_id 和 zipcode。数据库中的 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 的复合索引,但在某些情况下 10 个字符的 zip 可能会被丢弃。我可以以某种方式索引 LEFT(zip,5) 吗?
【问题讨论】:
-
你有这个查询的查询计划吗?这应该告诉你它是如何工作的。在考虑其他索引之前拥有这些信息应该是有用的。
-
不,您不能在索引中使用函数。在 Oracle 和 PostgreSQL 中可以,但在 MySQL 中不行。
-
“查询计划”是指在查询上运行 EXPLAIN... 吗?我没想到。谢谢。 @Johan:我在考虑 Oracle,我认为......很久以前做过 PL/SQL,并认为这个想法似乎是可能的。