Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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查询_Sql_Mysql_Database Design_Data Modeling - Fatal编程技术网

添加字段以优化MySQL查询

添加字段以优化MySQL查询,sql,mysql,database-design,data-modeling,Sql,Mysql,Database Design,Data Modeling,我有一个MySQL表,有3个字段: 地方 变量 价值 我经常使用以下查询: SELECT * FROM Table WHERE Location = '$Location' AND Variable = '$Variable' ORDER BY Location, Variable 我的表中有超过一百万行,查询速度有点慢。如果我添加一个字段VariableLocation(变量和位置的组合),它会提高查询速度吗?我可以将查询更改为: SELECT * FROM Tab

我有一个MySQL表,有3个字段:

地方 变量 价值 我经常使用以下查询:

SELECT * 
  FROM Table 
 WHERE Location = '$Location' 
   AND Variable = '$Variable' 
ORDER BY Location, Variable
我的表中有超过一百万行,查询速度有点慢。如果我添加一个字段VariableLocation(变量和位置的组合),它会提高查询速度吗?我可以将查询更改为:

SELECT * 
  FROM Table 
 WHERE VariableLocation = '$Location$Variable' 
ORDER BY VariableLocation
更正更新:

提供:@paxdiablo:


表中的一列不会有任何区别。您只需要在这两列上建立一个索引,MySQL引擎就会使用它。在表中添加列实际上比这更糟糕,因为它会破坏3NF并浪费空间。查看哪些状态:从tbl_名称中选择*,其中col1=val1和col2=val2;如果col1和col2上存在多列索引,可以直接获取适当的行。

尝试添加一个覆盖这两个字段的索引,这样您仍然可以获得性能提升,但也可以让您的数据易于理解,因为这两列似乎不应该合并,但您这样做只是为了获得性能。

我会添加一个覆盖索引,对于列位置和变量:

…但是,如果变量和位置对是唯一的,则它们应该是主键


合并这些专栏可能会带来更多的悲伤。例如,如果只需要按位置或变量提取记录,则必须对子查询中的值进行子串。

我建议不要组合这些字段。相反,创建一个索引,以与order BY子句相同的顺序覆盖这两个字段:

ALTER TABLE tablename ADD INDEX (location, variable);
组合索引和键仅用于涉及索引的所有字段或从左到右读取的这些字段的子集的查询。或者换句话说:如果在WHERE条件中使用location,则将使用此索引,但按变量排序不会使用该索引


当尝试优化查询时,EXPLAIN命令非常有用:

-1-你能解释一下为什么MySQL管理数据或优化查询时会出现这种情况吗?不,我不能向你解释,至少因为我不能像你那样一开始就否决你!!!如果你不能用已知的行为来解释某事,那么你就没有给出真正的答案。你没有理由说它肯定会提高性能,因为你不知道它为什么会这样做。事实上,你告诉OP的正是他/她想听到的,这充其量只是在传播无害的迷信,最坏的情况是会让他/她的查询执行得更差。与其他海报相比,其他海报实际上为添加索引给出了合理的解释。@kdgregory我的经验告诉我,当你执行基准测试时,你会得出结果。谢谢。这个答案完全是胡说八道。表中的一列不会有任何区别。您只需要在这两列上建立一个索引,MySQL引擎就会使用它。在表中添加列实际上比这更糟糕,因为它会破坏3NF并浪费空间。查看哪些状态:从tbl_名称中选择*,其中col1=val1和col2=val2;如果col1和col2上存在多列索引,则可以直接获取相应的行。
ALTER TABLE tablename ADD INDEX (location, variable);