Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql的最佳索引顺序(FK、键、值)_Mysql_Indexing - Fatal编程技术网

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

请注意投票结束此问题的人“主要基于意见”。。。。如果我们根据“意见”选择要定义的索引,我们就错了。很抱歉,我忘记添加一个示例查询。我已更新了问题,以便更清楚地说明索引要求