mysql的最佳索引顺序(FK、键、值)
我有一个键值表:mysql的最佳索引顺序(FK、键、值),mysql,indexing,Mysql,Indexing,我有一个键值表: id, data_id, key, value 引用数据表的: id, file_id, data 依次引用文件表: id, name 文件包含大约10000个条目 数据包含大约1亿个条目 键列有大约100个不同的值 值字段有许多不同的值(字符串) 现在我想知道三列data\u id、key、value 我的索引中应该有 我感兴趣的查询查找具有特定文件id和特定键值组合的数据项。例如: SELECT * FROM files, data, keyval WHERE fil
id, data_id, key, value
引用数据表的:
id, file_id, data
依次引用文件表:
id, name
文件包含大约10000个条目
数据包含大约1亿个条目
键列有大约100个不同的值
值字段有许多不同的值(字符串)
现在我想知道三列data\u id、key、value
我的索引中应该有
我感兴趣的查询查找具有特定文件id和特定键值组合的数据项。例如:
SELECT * FROM files, data, keyval
WHERE files.id = data.file_id
AND data.id = keyval.data_id
AND files.id = 999
AND keyval.key = 'revenue'
AND keyval.val = 9.99
索引中列的“最佳顺序”将取决于访问表的实际查询
如果我们运行的查询中唯一的谓词是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
是文件中的主键(或唯一键)
,并且
id
是数据中的主键(或唯一键)
我会创建索引
ON data (file_id,id)
ON keyval (data_id,key,val)
我将查看查询的解释输出,以查看查询计划,以及正在使用哪些索引
如果我们没有对
file.id
进行等式预测,并且如果key='revenue'和val=9.99
是非常有选择性的,
那么我们可能需要keyval
作为驱动表。我们将确保索引可用,并且
键
和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
另外,我们真的需要从所有三个表中提取所有列吗?
或者我们只是使用
*
作为一种快捷方式,以避免我们列出实际需要的列?键值模式很糟糕。随着您的查询越来越复杂,您将了解原因
你可以做的一件事就是按照提示去做
另外,请通过
JOIN。。。在
,而不是来自a,b的老式的,其中a.x=b.y
请注意投票结束此问题的人“主要基于意见”。。。。如果我们根据“意见”选择要定义的索引,我们就错了。很抱歉,我忘记添加一个示例查询。我已更新了问题,以便更清楚地说明索引要求