添加float的int值以提高选择速度

时间:2019-01-04 13:55:12

标签: mysql sql

如果我有一个带有浮点数的大表,那么如果我添加一个表示每个浮点数的int值的列,对读取速度有帮助吗?也许如果int值将是一个索引,那么当我需要选择所有以int开头的浮点数时,它将“过滤”那些肯定不是必需的值吗?

例如,如果有10,000个数字,其中有5000个以14:14.232、14.666等开头,那么如果添加了int值列,是否有一条sql语句可以提高选择速度?

  id  |  number   | int_value |
   1  |  11.232   |     11    |
   2  |  30.114   |     30    |
   3  |  14.888   |     14    |
  ..  |    ..     |     ..    |
 3005 |  14.332   |     14    |

2 个答案:

答案 0 :(得分:0)

您可以在数字列本身上创建非聚集索引。从表中选择数据时,您可以使用类似运算符过滤掉。无需其他列,

从mytable中选择* 像“ 14%”这样的数字

答案 1 :(得分:0)

首先:您是否有性能问题?如果不是,那为什么要担心?

然后:您需要存储小数,但是有时您只对整数部分感兴趣。是吗?

因此您有一个或多个类型的查询

where number >= 14 and number < 15

where truncate(number, 0) = 14

您已经在该号码上建立索引了吗?例如

create index idx on mytable(number);

第一个提到的WHERE子句可能会从中受益。第二个则没有,因为当您在列上调用一个函数时,DBMS不再看到与索引的关系。这表明它可以改变您编写查询的方式。

如果第一个WHERE子句尽管有索引仍然过慢,则可以创建一个计算列(ALTER TABLE mytable ADD numint int GENERATED ALWAYS AS truncate(number, 0) STORED),对其进行索引,然后访问它而不是查询中的number列。但我怀疑这样做是否会明显加快速度。

关于您的示例:

  

如果有10,000个数字,其中有5000个以14开头

这不是大表,而是小表。而且,由于您还是想要一半的记录,因此DBMS只需依次读取所有记录并查看编号即可。不管是整数还是十进制数都没有关系。 (嗯,也许是几纳秒,但您不会注意到。)