我有一个报告表,我存储说明
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查询第一个表时,它会扫描相同的行数
答案 0 :(得分:1)
使用索引可能对您没有帮助,因为MySQL仍然需要将索引从last_sno
扫描到数据的末尾。你最好使用TableA(description)
上的索引,因为这样的索引可以用于description like 'ABC%'
。
事实上,这可能是索引会伤害你的情况。索引不是按顺序读取表中的页面,而是随机读取它们 - 效率较低。
编辑:(评论太长)
尝试使用ignore index
提示运行查询,看看是否可以在没有它的情况下运行查询。索引可能实际上使事情变得更糟。
但是,“真正的”解决方案是将您感兴趣的前缀存储为单独的列。然后,您可以在此列上添加索引,并且查询应该使用基本SQL有效地工作。您不必花时间尝试优化简单的流程,因为数据将正确存储。