gpt4 book ai didi

Mysql 索引不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:36 27 4
gpt4 key购买 nike

我创建了两个具有一对多关系的表。

团队:-

CREATE TABLE TEAM(
ID INT(5) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(6) NOT NULL,
PRIMARY KEY(ID)
)ENGINE=INNODB;

成员:-

CREATE TABLE MEMBER (
ID INT(5) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(6) NOT NULL,
TEAM_ID INT(5) NOT NULL,
PRIMARY KEY (ID),
KEY TEAM_ID (TEAM_ID),
CONSTRAINT MEMBER_ibfk_1 FOREIGN KEY (TEAM_ID) REFERENCES TEAM (ID)
) ENGINE=InnoDB

一个团队可以有很多成员。

两个表中的数据:-

团队表

ID  NAME
1 TEAM 1
2 TEAM 2

Member Table:-

ID NAME TEAM_ID
1 M1 1
2 M2 1
3 M3 1
4 M4 1
5 M5 1
6 M6 1
7 M7 1
8 M8 1
9 M9 2
10 M10 2
11 M11 2
12 M12 2

团队 1 有 8 名成员,团队 2 有 4 名成员。

现在我正在执行下面的连接查询以获取团队和成员的详细信息。

SELECT * FROM TEAM JOIN MEMBER ON TEAM.ID = MEMBER.TEAM_ID WHERE TEAM.ID = 1

当我解释一个查询计划时,我得到的结果低于输出。

id  select_type table   type    possible_keys   key     key_len ref     rows          Extra
1 SIMPLE TEAM const PRIMARY PRIMARY 4 const 1 \N
1 SIMPLE MEMBER ALL TEAM_ID \N \N \N 12 Using where

我已经在外键上给出了索引,但 mysql 仍在扫描 member 表的所有行?为什么这样?

我使用的是 5.6.12 版本的 mysql。

请帮忙。

最佳答案

Mysql 考虑进行全扫描而不是读取索引更好,因为索引中的大多数值的值为 1。如果它决定扫描索引并从中获取数据,那么它将需要进行额外的查找以获取真实数据从表。这不是最佳方式。尝试创建只有一名成员的第三个团队,在这种情况下,mysql 必须使用索引。随着数据库的增长,Mysql 将开始使用索引,并且与整个数据相比,更多独特的数据将存储在 TEAM_ID 中。这称为索引基数。请参阅此处的说明 What is cardinality in MySQL? .

关于Mysql 索引不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com