关于mysql索引,多列还是单列?
我有这样一个sql:关于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排序的索引,而不是两个单独的索引 考虑这与或子句相反,在该子句中,您通常需要两个单独的索引
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,该数据库的模式和数据量/分布与您的生产系统(将是)相同。我认为,为了获得完整答案,您需要更具体地说明这些列中包含的数据。他们有独特的价值观吗?它们是什么类型的?我认为为了得到完整的答案,您需要更具体地了解这些列中包含的数据。他们有独特的价值观吗?它们是什么类型的?不,不应该“如果不匹配,则转到下一行”;您需要一个它将进行范围扫描的索引。实际上,“继续”意味着遍历表,这是当您根本没有索引时发生的情况。不,它不应该“如果不匹配,则继续到下一行”;你需要一个可以进行范围扫描的索引。事实上,“继续”意味着遍历表,当你根本没有索引时就会发生这种情况。