查询性能大于主键

时间:2013-07-20 10:51:49

标签: php mysql

我有一个报告表,我存储说明

tableA

sno   | Project |name     | description      | mins |
1     | prjA    |nameA    |ABC -10% task done|  30  |
...
3000  | prjA    |nameB    |ABC -70% task done|  70  |

我想查询描述字段并保存在另一个表中

tableB

id | valueStr | total_mins  | last_sno
1  |  ABC     | 100         | 3000

如果第二个表中没有条目,我创建一个默认值为

的条目

如果在第二个表中有和条目,我更新第二个表,使用total_mins并将last_sno增加到该值为3300,以便下次我查询此表时我从第二个表中获取值并基于last_sno

查询

SELCT last_sno FROM tableB where valueStr ='ABC'

the first 3 characters in the description field

SELECT max(sno), sum(mins) FROM tableA
 where sno > last_sno and description like 'ABC%'

由于第一个表有百万行,所以 我用sno>搜索第一个表。 last_sno,这应该有助于提高性能吗?

但解释显示,当我从第一个sno查询第一个表时,它会扫描相同的行数

1 个答案:

答案 0 :(得分:1)

使用索引可能对您没有帮助,因为MySQL仍然需要将索引从last_sno扫描到数据的末尾。你最好使用TableA(description)上的索引,因为这样的索引可以用于description like 'ABC%'

事实上,这可能是索引会伤害你的情况。索引不是按顺序读取表中的页面,而是随机读取它们 - 效率较低。

编辑:(评论太长)

尝试使用ignore index提示运行查询,看看是否可以在没有它的情况下运行查询。索引可能实际上使事情变得更糟。

但是,“真正的”解决方案是将您感兴趣的前缀存储为单独的列。然后,您可以在此列上添加索引,并且查询应该使用基本SQL有效地工作。您不必花时间尝试优化简单的流程,因为数据将正确存储。