Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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_Optimization_Indexing - Fatal编程技术网

关于mysql索引,多列还是单列?

关于mysql索引,多列还是单列?,sql,mysql,optimization,indexing,Sql,Mysql,Optimization,Indexing,我有这样一个sql: SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth 那么,我如何为它创建索引呢 两列一个索引 每列两个索引 哪一个更好?如果您正针对一个查询进行优化,那么a将是最佳优化。您的WHERE子句将首先检查列a,如果不匹配,则转到下一行。只有在列a处匹配时,才会继续检查列b。因此,您需要一个先按列a排序,然后按列b排序的索引,而不是两个单独的索引 考虑这与或子句相反,在该子句中,您通常需要两个单独的索引

我有这样一个sql:

SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth
那么,我如何为它创建索引呢

  • 两列一个索引
  • 每列两个索引

哪一个更好?

如果您正针对一个查询进行优化,那么
a
将是最佳优化。您的
WHERE
子句将首先检查
列a
,如果不匹配,则转到下一行。只有在
列a
处匹配时,才会继续检查
列b
。因此,您需要一个先按
列a
排序,然后按
列b
排序的索引,而不是两个单独的索引

考虑这与
子句相反,在该子句中,您通常需要两个单独的索引,因为
表示,“首先为
列a
选择所有匹配项,然后独立地为
列b
选择所有匹配项,最后将结果集合并在一起”。由于该查询在检查
column\u b
时不使用来自
column\u a
的反馈,因此您希望在那里使用不同的索引


还要注意,这些都是用非常笼统的术语编写的。根据您的数据的不同,这些情况可能会有所不同。一个好方法是创建一个索引,查看性能如何,删除它,创建另一个索引,然后选择最佳索引。

如果您正针对这一查询进行优化,那么
a
将是最佳优化。您的
WHERE
子句将首先检查
列a
,如果不匹配,则转到下一行。只有在
列a
处匹配时,才会继续检查
列b
。因此,您需要一个先按
列a
排序,然后按
列b
排序的索引,而不是两个单独的索引

考虑这与
子句相反,在该子句中,您通常需要两个单独的索引,因为
表示,“首先为
列a
选择所有匹配项,然后独立地为
列b
选择所有匹配项,最后将结果集合并在一起”。由于该查询在检查
column\u b
时不使用来自
column\u a
的反馈,因此您希望在那里使用不同的索引


还要注意,这些都是用非常笼统的术语编写的。根据您的数据的不同,这些情况可能会有所不同。一个好方法是创建一个索引,查看性能如何,删除它,创建另一个索引,然后选择最佳索引。

要更好地阅读,如果查询同时包含两个比较,则应该在两列上有一个索引


但是,如果查询在where子句中只有第二列,则可以在第二列上创建另一个索引。

如果查询同时包含两个比较,则为了更好地读取,应该在两列上创建一个索引


但是,如果您的查询在where子句中只有第二列,则可以在第二列上创建另一个索引。

需要记住的是,同一索引中的两列或更多列的MySql索引可以正常工作,以便创建索引

因此,要进行优化,必须首先将列a放入索引中,然后将列b放入索引中。
这是为了避免表扫描。

需要记住的是,同一索引中的两个或更多列的MySql索引按照创建索引的顺序工作

因此,要进行优化,必须首先将列a放入索引中,然后将列b放入索引中。
这是为了避免表扫描。

您需要一个可以进行范围扫描的索引。使用解释(见文档),它是你的朋友


在这种情况下,列a、列b上的索引应该能够进行范围扫描,但始终选中“解释”。在非生产数据库上使用EXPLAIN,其模式和数据量/分布与您的生产系统(将是)相同。

您需要一个可以进行范围扫描的索引。使用解释(见文档),它是你的朋友


在这种情况下,列a、列b上的索引应该能够进行范围扫描,但始终选中“解释”。在非生产数据库上使用EXPLAIN,该数据库的模式和数据量/分布与您的生产系统(将是)相同。

我认为,为了获得完整答案,您需要更具体地说明这些列中包含的数据。他们有独特的价值观吗?它们是什么类型的?我认为为了得到完整的答案,您需要更具体地了解这些列中包含的数据。他们有独特的价值观吗?它们是什么类型的?不,不应该“如果不匹配,则转到下一行”;您需要一个它将进行范围扫描的索引。实际上,“继续”意味着遍历表,这是当您根本没有索引时发生的情况。不,它不应该“如果不匹配,则继续到下一行”;你需要一个可以进行范围扫描的索引。事实上,“继续”意味着遍历表,当你根本没有索引时就会发生这种情况。