mysql关于where子句对列计算时 索引无效的问题,请进

这样的 例如:我有一个50万行的表
CREATE TABLE t1(
   name varchar(32),
   code int,
   key (code)
);
现在 我有这样一个sql:
SELECT * FROM t1 WHERE code&14=14;
此时 code的索引是无效的,从explain可以看出
mysql仍然会扫描所有50万行数据。
请问这样我要怎样才能提高查询效率呢?

作者: 艾斯尼勒   发布时间: 2011-03-08

SELECT * FROM t1 WHERE code&14=14;

很明显这句话是用不到索引的。
MYSQL不支持函数索引,索引只能进行简单判断,而不能经过运算后进行比较。

SELECT * FROM t1 WHERE code+14=14;
这样用不到索引。

SELECT * FROM t1 WHERE code=14-14;
这样可以用到索引。

作者: 909413335   发布时间: 2011-03-08

回复 909413335


    是啊 , 这可难死我了,按位与这种操作貌似又不能像四则运算一样改到等号的另一边
我那code是按位存放的特征,要按特征检索的。麻烦了

作者: 艾斯尼勒   发布时间: 2011-03-08

哈哈,
你可以在表里添加一列,就是按位与操作的结果,用触发器来维护这个值,然后在查询的时候就可以直接用这个字段来做索引了。

作者: 909413335   发布时间: 2011-03-08

哎 这个 要与的操作数是临时的

作者: 艾斯尼勒   发布时间: 2011-03-08

其实我就是要code里面某几位为1的列...

作者: 艾斯尼勒   发布时间: 2011-03-08

换个思路看看。

其实我就是要code里面某几位为1的列...


举个例子出来。

作者: 909413335   发布时间: 2011-03-08

是这样的,产品有一些特征。用户检索的时候需要根据综合特征来进行检索
如果我把这些特征都弄成列的话,到是方便索引
但第一,索引占用空间很大
第二,维护变的很麻烦

所以我就想给特征进行编码,例如
可加速=1
可变形=2
高熔点=4
可浸泡=8
以此类推,那么更新一个产品的时候,只要把这个产品的所有特点相加,就成为这个产品的特征码

当用户检索一个可浸泡可加速的产品的时候,特征码是9

我只要用库存产品的特征码按位与检索特征码==检索特征码这样的方法来判断,就能检索出用户想要的产品

但是因为索引无效,当表行大了之后,就会形成性能瓶颈

让我很无奈

作者: 艾斯尼勒   发布时间: 2011-03-08

呵呵,这样啊。
你干脆多搞几个字段,P1-P20
假定有20个特征,每个产品有N个特征,就对应在P1-P20字段里面有值,其他默认NULL,

查询的时候就很方便了,也不需要总去改变表结构。

作者: 909413335   发布时间: 2011-03-08

嗯 看来只好这么办了 20中特征就加20列,联合索引一下...

作者: 艾斯尼勒   发布时间: 2011-03-08