我正在使用 MySQL 数据库,其中有一列 VARCHAR 类型,但它存储数值。我在此列上创建了 B 树索引来优化查询,例如:
E.x > n
n < E.x
n = E.x
(其中 n 是正浮点数,E 是实体,因此 x 代表属性) 然而,我怀疑该指数没有提供预期的性能提升。我的理由如下:
MySQL 中的 B 树索引依赖于列数据的自然排序。对于 VARCHAR,此排序是字典顺序,而不是数字顺序。鉴于 B 树索引旨在根据定义的排序顺序高效工作,字典排序和数字排序之间的不匹配可能会导致数字比较的索引使用效率低下。
此外,查询中的数据被转换为 DECIMAL。我认为这也会对性能产生影响。
问题: 我的假设是否正确,即这种类型的索引对于 VARCHAR 列上的数字比较无效? 是否有任何我可以应用的解决方法或优化而不更改列的数据类型(例如,在查询期间进行转换)? 切换到正确的数字数据类型(如 INT 或 DECIMAL)和索引是唯一真正的解决方案吗? 任何见解或建议将不胜感激!谢谢!
“让它发挥作用、让它正确、让它快速。”期望您按顺序执行这些任务。 IE。做对之后再担心表现。
你还没有做对。 :-)
假设你计算这个表达式:
E.x > n
这些值是以下 VARCHAR 字符串:
'1024' > '256'
如果将它们存储为字符串,则“1024”在词法上不大于“256”。第一个字符“1”小于第一个字符“2”。所以表达式返回 false。我怀疑这就是你想要的数字比较。
仅当数字始终具有相同的位数时,比较数字存储为字符串时的数值才有效:
'1024' > '0256'
'1024' > '2048'
因此,在您担心将数字存储为字符串时的索引效率之前,我建议您选择 INT
或
DECIMAL
数据类型,以便逻辑能够正确评估。您还会发现索引对于
INT
或
DECIMAL
类型非常有效。