首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -内连接表上的复合索引?

SQL -内连接表上的复合索引?
EN

Stack Overflow用户
提问于 2016-12-16 23:48:13
回答 1查看 837关注 0票数 0

我正在尝试创建一个或多个额外的索引来加快下面的查询速度。所有的键都是主键(除了表A上的id ),所以它们已经有一个默认的btree索引与之关联。表A上的id也已经有一个与之关联的索引,因为它是一个MUL键,这意味着它是非惟一索引的一部分。

代码语言:javascript
复制
Select A.id
From TableA A
      Inner join TableB B
      On A.address = B.address
      And A.code = B.code
Group by A.id
Having count(distinct B.user) = 1;

以下是上述表格的当前索引:

代码语言:javascript
复制
mysql> show index from TableA;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| TableA |          0 | PRIMARY  |            1 | address      | A         |           8 |     NULL | NULL   |      | BTREE      |         |
| TableA |          0 | PRIMARY  |            2 | code         | A         |          24 |     NULL | NULL   |      | BTREE      |         |
| TableA |         1  | id       |            1 | id           | A         |           8 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+


mysql> show index from TableB;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| TableB    |          0 | PRIMARY  |            1 | user        | A         |           9 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          0 | PRIMARY  |            2 | address     | A         |           9 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          0 | PRIMARY  |            3 | code        | A         |           9 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          1 | address  |            1 | address     | A         |           9 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          1 | address  |            2 | code        | A         |           9 |     NULL | NULL   |      | BTREE      |         |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

查询解释说明如下:

代码语言:javascript
复制
    +----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                                   | rows | Extra                                        |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+
|  1 | SIMPLE      | F     | index  | address       | address | 514     | NULL                                  |    9 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | A     | eq_ref | PRIMARY       | PRIMARY | 514     | db.B.address,db.B.code                |    1 |                                              |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+

我不明白我应该做什么。地址和代码的复合索引是提高上述查询速度的唯一方法吗?

或者id的聚集索引(因为查询使用group by)更好?或者我可以两者都使用?

EN

回答 1

Stack Overflow用户

发布于 2016-12-17 00:04:49

截至2016年底,MySQL不能在单个查询中利用任何给定表的多个索引。因此,添加新的单列索引无济于事。我想你知道这一点。

如果不尝试一下,很难知道复合索引会有多好。也就是说,我建议你在TableB上试试这个索引。(address, code, user)

为什么?该查询查找codeaddress的特定值,然后汇总user。试试看。

您也可以在TableA上尝试复合索引。应该是(id, address, code)。这从id开始,因为您在TableA上没有任何WHERE过滤器,并且可以通过以id顺序扫描表来优化GROUP BY子句。但请先尝试TableB索引。

http://use-the-index-luke.com/是一个很好的参考资料。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41187911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档