0

我有一个报告表,我在其中存储描述

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 查询第一个表时,它扫描的行数相同

4

1 回答 1

1

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

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

编辑:(评论太长)

尝试运行带有ignore index提示的查询,看看是否可以在没有提示的情况下运行查询。该指数实际上可能让事情变得更糟。

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

于 2013-07-20T11:00:39.153 回答