我的表上有一个用于密码的列varchar,在某些脚本中我会进行如下查询:
length(column_varchar) < 10
我的问题是,如果我在此列上添加索引,它会有帮助吗?或者在这种情况下应该使用全文?或者不需要索引?
我需要在所有列中使用索引的另一个问题将在'where'中使用?
先谢谢。
答案 0 :(得分:2)
索引用于索引内容(字段值),而不是字段的长度,因此在上述查询中没有索引可以帮助。 (注意,您可以拥有一个具有内容长度和索引以分隔字段的sparate字段。)此外,密码应以散列格式存储,因此所有密码长度应相同,或者至少不应该是选择。
不,您不应该索引将在where条件中使用的所有列。选择最佳索引结构是一个复杂而广泛的主题。在尝试确定要索引的字段(或字段组合)时,请始终考虑以下几点:
索引加速选择,但减慢数据修改速度,因为您还必须更新索引,而不仅仅是列的值。
MySQL在查询中每个表只能使用1个索引。
MySQL使用索引的选择性来确定使用哪个索引。一个只能有2个值的字段(是/否,真/假)不够有选择性,所以不要给索引编制索引。
始终使用explain
命令检查查询使用的索引。
答案 1 :(得分:0)
你在这里有两个问题,一般来说你应该分开问题。
无论如何,第一个&#34;它是否有助于索引你进行长度测试的列。&#34;
不,它不会。你可以在这里改进性能的唯一方法是有一个额外的列,它保存column_varchar中的值的长度和索引。
你在评论中写道,你持有哈希,所以长度都是一样的,所以我不得不猜测一些密码是空的,所以你不要哈希它们,或者你要从中迁移哈希到哈希。
第二个问题:你应该索引where子句中的所有字段吗?这不是自动的,这就是为什么有关于查询优化的书籍。
这取决于您从索引中获得多少好处,这取决于数据的性质。
主要权衡是插入速度和查询速度之间的关系。索引会减慢插入速度并加快查询速度。
接下来要考虑的是选择性。例如,如果您要编制索引的值只有三个潜在值,则数据库将需要频繁更新索引以从中获取实际值。
在这种特定的情况下,你有均匀分布的数据(因为它是散列的),你有很好的选择性(MD5有很少的冲突),你期望用一个术语更频繁地查询,所以你绝对应该索引这个列。