如果我有一个带有浮点数的大表,那么如果我添加一个表示每个浮点数的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 |
答案 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只需依次读取所有记录并查看编号即可。不管是整数还是十进制数都没有关系。 (嗯,也许是几纳秒,但您不会注意到。)