mysql最佳索引顺序(FK,键,值)

时间:2018-02-07 17:48:34

标签: mysql indexing

我有一个键值表:

t_copy: 99.972,  t_sort: 215.597, t_both: 393.861
t_copy: 100.769, t_sort: 225.234, t_both: 394.839
t_copy: 100.489, t_sort: 221.44,  t_both: 397.042
t_copy: 100.047, t_sort: 214.231, t_both: 403.371
t_copy: 100.167, t_sort: 222.031, t_both: 393.143
t_copy: 100.255, t_sort: 209.191, t_both: 374.633
t_copy: 100.179, t_sort: 208.452, t_both: 374.122
t_copy: 100.038, t_sort: 208.39,  t_both: 375.454
t_copy: 100.072, t_sort: 208.468, t_both: 376.02
t_copy: 100.069, t_sort: 208.426, t_both: 377.759

引用数据表:

id, data_id, key, value

反过来引用文件表:

id, file_id, data

个文件包含大约10000个条目 数据包含大约1亿条目

键列有大约100个不同的值 值字段有许多不同的值(字符串)

现在我想知道三列id, name 的顺序 应该在我的索引中。

我感兴趣的查询会查找具有某些file_id和特定键值组合的数据条目。 E.g:

data_id, key, value

2 个答案:

答案 0 :(得分:2)

"最佳订单"索引中的列数取决于访问表的实际查询(查询)。

如果我们运行的查询中唯一的谓词是WHERE data.key = 'foo',那么最大的好处就是使用key作为前导列的索引。

如果我们没有任何查询在key列(WHERE子句或ON子句)中有谓词,并且没有查询GROUP BY data.key, ...,那么我们可能不需要key作为任何索引中的前导列。

有时我们会添加多个索引,包含不同的列和列顺序,以满足各种查询。

索引中列的顺序选择不仅取决于数据类型和值分布,还取决于我们计划运行的实际查询的性能要求。

修改

添加到问题的查询格式为:

 SELECT f.*
      , d.*
      , k.*
   FROM files f
   JOIN data d
     ON d.file_id = f.id
   JOIN keyval k
     ON k.data_id = d.id
    AND k.key     = 'revenue'
    AND k.val     = 9.99
  WHERE f.id = 999

假设
idfiles中的PRIMARY KEY(或唯一键)
iddata

中的PRIMARY KEY(或唯一键)

我创建了索引

 ON data (file_id,id)
 ON keyval (data_id,key,val)

我查看查询的EXPLAIN输出以查看查询计划以及正在使用的索引。

如果我们在file.id上没有平等,并且key='revenue' and val=9.99 非常选择性, 那么我们可能希望keyval作为驾驶表。我们会确保一个可用的索引 keyval作为主要列,例如

ON keyval(key,val,data_id)

如果查询等同于:

,我们希望该索引
 SELECT f.*
      , d.*
      , k.*
   FROM keyval k
   JOIN data
     ON d.id  = k.data_id
   JOIN files f
     ON f.id  = d.file_id
 -- AND f.id  = 999
  WHERE k.key = 'revenue'
    AND k.val = 9.99

另外,我们是否真的需要从所有三个表中提取所有列? 或者我们只是使用*作为快捷方式,以避免我们列出我们实际需要的列?

答案 1 :(得分:0)

键值架构很糟糕。随着您的查询越来越多,您将理解为什么。

您可以采取一些措施来帮助部分按照提示here进行操作。

另外,请通过JOIN ... ON指定表格中的关系,而不是过时的FROM a,b WHERE a.x = b.y