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

时间:2016-06-15 14:00:05

标签: php mysql

我的表上有一个用于密码的列varchar,在某些脚本中我会进行如下查询:

length(column_varchar) < 10

我的问题是,如果我在此列上添加索引,它会有帮助吗?或者在这种情况下应该使用全文?或者不需要索引?

我需要在所有列中使用索引的另一个问题将在'where'中使用?

先谢谢。

2 个答案:

答案 0 :(得分:2)

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

不,您不应该索引将在where条件中使用的所有列。选择最佳索引结构是一个复杂而广泛的主题。在尝试确定要索引的字段(或字段组合)时,请始终考虑以下几点:

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

  2. MySQL在查询中每个表只能使用1个索引。

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

  4. 始终使用explain命令检查查询使用的索引。

答案 1 :(得分:0)

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

无论如何,第一个&#34;它是否有助于索引你进行长度测试的列。&#34;

不,它不会。你可以在这里改进性能的唯一方法是有一个额外的列,它保存column_varchar中的值的长度和索引。

你在评论中写道,你持有哈希,所以长度都是一样的,所以我不得不猜测一些密码是空的,所以你不要哈希它们,或者你要从中迁移哈希到哈希。

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

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

主要权衡是插入速度和查询速度之间的关系。索引会减慢插入速度并加快查询速度。

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

在这种特定的情况下,你有均匀分布的数据(因为它是散列的),你有很好的选择性(MD5有很少的冲突),你期望用一个术语更频繁地查询,所以你绝对应该索引这个列。