Php 列varchar和关于索引或全文的问题?

Php 列varchar和关于索引或全文的问题?,php,mysql,Php,Mysql,我的表中有一列varchar作为密码,在一些脚本中,我会进行如下查询: length(column\u varchar)

我的表中有一列varchar作为密码,在一些脚本中,我会进行如下查询:

length(column\u varchar)<10

我的问题是,如果我在这个专栏上放一个索引,它会有帮助吗?或者在这种情况下应该使用全文?或者不需要索引

另一个问题是我需要在“where”中使用的所有列中使用索引


感谢高级。

索引用于索引内容(字段值),而不是字段的长度,因此在上述查询中没有索引可以帮助。(注意,您可以有一个sparate字段,该字段具有单独字段的内容长度和索引。)此外,密码应以散列格式存储,因此所有密码长度应相同,或者至少不应作为选择的标准

不,您不应该索引将在where条件中使用的所有列。选择最优的索引结构是一个复杂而广泛的话题。当试图确定哪些字段(或字段组合)为索引时,总是考虑以下几点:

  • 索引会加速选择,但会减慢数据修改,因为您还必须更新索引,而不仅仅是列的值

  • MySQL在查询中每个表只能使用1个索引

  • MySQL使用索引的选择性来确定使用哪个索引。一个只能有2个值(是/否,真/假)的字段没有足够的选择性,所以不要为它编制索引

  • 始终使用
    explain
    命令检查查询使用的索引


  • 这里有两个问题,一般来说你应该把问题分开

    不管怎么说,第一个“将有助于索引一个列,您在其中进行长度测试。”

    不,不会的。在这里提高性能的唯一方法是增加一列,该列保存列_varchar中的值的长度,并对其进行索引

    你在评论中写道,你持有散列,所以长度都是一样的,所以我不得不猜测一些密码是空的,所以你没有散列,或者你正在从非散列迁移到散列

    第二个问题:是否应该为where子句中的所有字段编制索引。这不是自动的“是”,这就是为什么有关于查询优化的书籍

    这取决于您将从索引中获得多少好处,这取决于数据的性质

    主要的折衷是插入速度和查询速度。索引会降低插入速度并加快查询速度

    接下来要考虑的是选择性。例如,如果要索引的值只有三个潜在值,则数据库将需要频繁更新索引以从中获取实际值


    在这种特定情况下,您的数据分布均匀(因为它是散列的),您的选择性很强(MD5几乎没有冲突),并且您希望使用单个术语进行更频繁的查询,因此您肯定应该为该列编制索引。

    建议为“where”中使用的所有列编制索引。我有一个问题,你什么时候需要搜索“密码”栏?显然,您的密码列只包含密码哈希,对吗?@MagnusEriksson,是的,我存储的密码是md5。md5不是安全哈希。您可以在这里了解更多信息:-问题是密码列应该只包含单向散列,包括salt。如果您可以通过搜索查看密码的长度或通过SQL查询查找匹配项,则您的哈希可能以错误的方式实现。@MagnusEriksson,请理解,但我是否应该在本列中使用索引?这将有助于查询:length(column_varchar)<10?全文索引用于执行自然搜索(如搜索“系列最佳”和查找“系列最佳”)。它无助于检测无效哈希。(为什么查找无效散列是如此常见的操作,以至于您甚至需要一个索引?)比我写得更快、更雄辩,这是一个很好的答案。