我有一个键值表:
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
答案 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
假设
id
是files
中的PRIMARY KEY(或唯一键)
id
是data
我创建了索引
ON data (file_id,id)
ON keyval (data_id,key,val)
我查看查询的EXPLAIN输出以查看查询计划以及正在使用的索引。
如果我们在file.id
上没有平等,并且key='revenue' and val=9.99
非常选择性,
那么我们可能希望keyval
作为驾驶表。我们会确保一个可用的索引
key
和val
作为主要列,例如
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