Php 查询性能大于主键

Php 查询性能大于主键,php,mysql,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

我有一个用于存储描述的报告表

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
若第二个表中并没有条目,我将创建一个带有默认值的条目

如果第二个表中有和条目,我将更新第二个表,使用总分钟数,并将最后一个小时增加到该值,比如3300,以便下次查询该表时,我从第二个表中获取值,并基于最后一个小时

质疑

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\u sno搜索第一个表,这样应该有助于提高性能,对吗


但是解释显示它扫描相同数量的行,当我从第一个sno查询第一个表时,索引的使用可能对您没有帮助,因为MySQL仍然必须扫描从最后一个sno到数据末尾的索引。您最好在
表a(description)
上创建一个索引,因为这样的索引可以用于
描述,比如“ABC%”

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

编辑:(评论太长)

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


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

除了向tableA添加索引之外,还有其他方法吗,因为它是一个重要的表,我不想更改它。在where子句中,sno>last\u sno,如果失败,将比比较文本花费更少的时间,对吗?@NaveenKumar。因为
sno
是主键,所以扫描主键索引应该会更快地进行比较。如果它只是一个常规列,那么不一定是这样,因为页面不会按顺序读取。