Php 列varchar和关于索引或全文的问题?
我的表中有一列varchar作为密码,在一些脚本中,我会进行如下查询:Php 列varchar和关于索引或全文的问题?,php,mysql,Php,Mysql,我的表中有一列varchar作为密码,在一些脚本中,我会进行如下查询: length(column\u varchar)
length(column\u varchar)<10
我的问题是,如果我在这个专栏上放一个索引,它会有帮助吗?或者在这种情况下应该使用全文?或者不需要索引
另一个问题是我需要在“where”中使用的所有列中使用索引
感谢高级。索引用于索引内容(字段值),而不是字段的长度,因此在上述查询中没有索引可以帮助。(注意,您可以有一个sparate字段,该字段具有单独字段的内容长度和索引。)此外,密码应以散列格式存储,因此所有密码长度应相同,或者至少不应作为选择的标准 不,您不应该索引将在where条件中使用的所有列。选择最优的索引结构是一个复杂而广泛的话题。当试图确定哪些字段(或字段组合)为索引时,总是考虑以下几点:
explain
命令检查查询使用的索引这里有两个问题,一般来说你应该把问题分开 不管怎么说,第一个“将有助于索引一个列,您在其中进行长度测试。” 不,不会的。在这里提高性能的唯一方法是增加一列,该列保存列_varchar中的值的长度,并对其进行索引 你在评论中写道,你持有散列,所以长度都是一样的,所以我不得不猜测一些密码是空的,所以你没有散列,或者你正在从非散列迁移到散列 第二个问题:是否应该为where子句中的所有字段编制索引。这不是自动的“是”,这就是为什么有关于查询优化的书籍 这取决于您将从索引中获得多少好处,这取决于数据的性质 主要的折衷是插入速度和查询速度。索引会降低插入速度并加快查询速度 接下来要考虑的是选择性。例如,如果要索引的值只有三个潜在值,则数据库将需要频繁更新索引以从中获取实际值
在这种特定情况下,您的数据分布均匀(因为它是散列的),您的选择性很强(MD5几乎没有冲突),并且您希望使用单个术语进行更频繁的查询,因此您肯定应该为该列编制索引。建议为“where”中使用的所有列编制索引。我有一个问题,你什么时候需要搜索“密码”栏?显然,您的密码列只包含密码哈希,对吗?@MagnusEriksson,是的,我存储的密码是md5。md5不是安全哈希。您可以在这里了解更多信息:-问题是密码列应该只包含单向散列,包括salt。如果您可以通过搜索查看密码的长度或通过SQL查询查找匹配项,则您的哈希可能以错误的方式实现。@MagnusEriksson,请理解,但我是否应该在本列中使用索引?这将有助于查询:length(column_varchar)<10?全文索引用于执行自然搜索(如搜索“系列最佳”和查找“系列最佳”)。它无助于检测无效哈希。(为什么查找无效散列是如此常见的操作,以至于您甚至需要一个索引?)比我写得更快、更雄辩,这是一个很好的答案。