And*_* SK 1 mysql sql indexing optimization query-optimization
我有一个翻译表(MySQL MyISAM)用于单词(现在是空的,但一旦插入单词就会变得很大).
只有两种SELECT可以在该表上请求信息:
SELECT translation FROM table WHERE lang_original='en' AND lang_target='de' AND word = 'house'
//this will return 'Haus'
Run Code Online (Sandbox Code Playgroud)
SELECT lang_original,translation FROM table WHERE lang_target='de' AND word = 'house'
//this will return 'en','Haus'
Run Code Online (Sandbox Code Playgroud)
通常我会将这些字段与单独的索引:
但是,我刚刚阅读了另一个线程中的组合索引,但我仍然对如何使用它们有一些疑问.
我应该只有3个索引吗?
那些组合索引应该是UNIQUE还是INDEX类型?为什么?
我是否还需要为lang_original,lang_target和word设置分离的索引,尽管它们不会被自己过滤掉?
更新1 fixed =而不是LIKE
正如我上面提到的,使用EXPLAIN会告诉你查询的执行方式和索引或不被使用.
1)我应该只有3个索引吗?
- id_word(主要/自动增量)
- 合并:lang_target + word
- 合并:lang_original + lang_target + word
拥有这些复合索引会起作用.两个复合索引之间有很多重叠,所以也许你可以找到一种方法来组合它们:
(lang_target, word(10), lang_original)
Run Code Online (Sandbox Code Playgroud)
我建议为word列使用合理的前缀大小,这样它们就是一个设定的长度(比方说,10).绝大多数单词在前10个字符中是不同的,因此它必须从磁盘读取的情况因为它们通过10个字符相同才是罕见的.前缀长度是索引大小和执行速度之间的平衡.较大的前缀将遇到较少的前缀冲突,但它将是一个更耗费内存的索引.另一方面,较小的前缀将节省内存但可能导致更多的前缀冲突(因此必须转到磁盘以在几个记录之间进行最终确定).玩适合你的东西.也许它是5,也许是15.
那些组合索引应该是UNIQUE还是INDEX类型?为什么?
如果(lang_target, word, lang_original)将是一个独特的组合(似乎是这种情况),请继续使用UNIQUE约束,但word前提是您不要使用前缀(在这种情况下word可能存在具有相同部分值的多个记录).作为一个指标,我认为它们仍然在功能上是等同的.
我是否还需要为lang_original,lang_target和word设置分离的索引,尽管它们不会被自己过滤掉?
复合索引中的列从左到右使用.在(lang_target, word(10), lang_original),如果您只是查询条件lang_target,则可以使用索引,但是如果您有条件lang_original,则除非您同时查询两者lang_target,否则无法使用该索引word.因此,只有对创建其它索引word和/或lang_original是否需要进行查询没有一个lang_target条件.有关详细说明,请参阅有关多列索引的此doc页面.
另外一个想法:如果你的lang_列总是只有两个字符,那就CHAR改成它们而不是VARCHAR.对于一个大小的列,VARCHAR每个值需要一个额外的字节来指定数据长度,而它是一个固定的长度CHAR.拥有数百万条记录,每个字节对于大小和速度都很重要.
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |