Mysql 解释选择,为什么类型=全部?

Mysql 解释选择,为什么类型=全部?,mysql,Mysql,有以下三个表格: 使用者 帖子 类别 和表中的数据: INSERT INTO `users` (`user_id`, `first_name`, `last_name`) VALUES (1, 'John', 'Doe'), (2, 'Pen', 'Poe'), (3, 'Robert', 'Roe'); INSERT INTO `categories` (`category_id`, `name`) VALUES (1, 'Category 1'),

有以下三个表格:

使用者 帖子 类别 和表中的数据:

INSERT INTO `users` (`user_id`, `first_name`, `last_name`) VALUES
    (1, 'John', 'Doe'),
    (2, 'Pen', 'Poe'),
    (3, 'Robert', 'Roe');

INSERT INTO `categories` (`category_id`, `name`) VALUES
    (1, 'Category 1'),
    (2, 'Category 2'),
    (3, 'Category 3'),
    (4, 'Category 4');

INSERT INTO `posts` (`post_id`, `category_id`, `author_id`, `title`, `text`) VALUES
    (1, 1, 1, 'title 1', 'text 1'),
    (2, 1, 2, 'title 2', 'text 2');
我想做一个简单的选择(让MySQL解释一下):

我明白了:

我不明白的是,为什么MySQL必须在
u
users
)进行完整的表扫描。我的意思是,它只需要检索两个用户的数据(id分别为
1
2
),这两个用户可以通过主键
user\u id
找到。有经验的人能帮我理解这一点吗?有没有更好的方法来创建索引,这样MySQL就不必对
users
表进行完全扫描来检索关于文章作者的数据


谢谢你

根据测试数据和解释报告,您的
users
表中只有~3行

如果表中的行太少,优化器可能会产生扭曲的结果。它可以对一个很小的表进行表扫描,即使它会对具有几百行或几千行的相同表使用索引进行相同的查询


因此,在进行开发时,如果希望获得准确的优化器报告,表中必须有大量的测试数据。根据测试数据和解释报告,在
用户表中只有~3行

如果表中的行太少,优化器可能会产生扭曲的结果。它可以对一个很小的表进行表扫描,即使它会对具有几百行或几千行的相同表使用索引进行相同的查询


因此,在进行开发时,如果您希望获得准确的优化器报告,那么表中有大量的测试数据是很重要的。

因此,对于如此少量的测试数据,索引搜索将比顺序搜索慢。因此,MySQL选择使用简单的表读取

这与这里的运营效率有关。让我们简单介绍MySQL读取整个表所需的操作,而不是使用索引

全文如下:

  • 开桌
  • 一次读一行并匹配标准
  • 返回结果集
  • 这是5次行动

    索引读取

  • 开桌
  • 有关标准,请阅读每行的索引
  • 使用索引指针为每一行定位磁盘上的行
  • 返回结果集
  • 在这种情况下,需要8个操作


    这是非常简单的,但是除非你有足够的数据,否则你的索引会减慢你的速度。随着表的增长,MySQL可能会选择不同的查询路径。这就是为什么不强制使用索引的原因。

    因此,使用如此少量的索引搜索将比顺序搜索慢。因此,MySQL选择使用简单的表读取

    这与这里的运营效率有关。让我们简单介绍MySQL读取整个表所需的操作,而不是使用索引

    全文如下:

  • 开桌
  • 一次读一行并匹配标准
  • 返回结果集
  • 这是5次行动

    索引读取

  • 开桌
  • 有关标准,请阅读每行的索引
  • 使用索引指针为每一行定位磁盘上的行
  • 返回结果集
  • 在这种情况下,需要8个操作


    这是非常简单的,但是除非你有足够的数据,否则你的索引会减慢你的速度。随着表的增长,MySQL可能会选择不同的查询路径。这就是为什么不强制使用索引。

    表中有多少行?请参阅我问题中的“和表中的数据:…”。只有这些行。有人能向我解释为什么大多数人在写查询时使用如此糟糕的单字符别名吗?这背后的原因是什么??他们在哪里找到的?@PeeHaa这只是一个例子,但我很好奇在这种情况下你会使用什么别名?我不认为在这里使用别名的理由。如果有原因(例如多次尝试加入一个表),至少给他们一个合理的名字。或者您也只使用单个字符作为变量名?表中有多少行?请参阅我的问题中的“和表中的数据:…”。只有这些行。有人能向我解释为什么大多数人在写查询时使用如此糟糕的单字符别名吗?这背后的原因是什么??他们在哪里找到的?@PeeHaa这只是一个例子,但我很好奇在这种情况下你会使用什么别名?我不认为在这里使用别名的理由。如果有原因(例如多次尝试加入一个表),至少给他们一个合理的名字。或者你也只是用一个字符作为变量名吗?请再说一遍谢谢比尔。知道真的很有用。再告诉我一次比尔谢谢比尔。知道真的很有用。这很有意义。谢谢你的详细回答,这很有道理。谢谢你的详细回答。
    CREATE TABLE `posts` (
        `post_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
        `category_id` MEDIUMINT(8) UNSIGNED NOT NULL,
        `author_id` MEDIUMINT(8) UNSIGNED NOT NULL,
        `title` VARCHAR(128) NOT NULL,
        `text` TEXT NOT NULL,
        PRIMARY KEY (`post_id`),
        INDEX `FK_posts__category_id` (`category_id`),
        INDEX `FK_posts__author_id` (`author_id`),
        CONSTRAINT `FK_posts__author_id` FOREIGN KEY (`author_id`) REFERENCES `users` (`user_id`) ON UPDATE CASCADE,
        CONSTRAINT `FK_posts__category_id` FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`) ON UPDATE CASCADE ON DELETE CASCADE
    )
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=1;
    
    CREATE TABLE `categories` (
        `category_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
        `name` VARCHAR(64) NOT NULL,
        PRIMARY KEY (`category_id`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=1;
    
    INSERT INTO `users` (`user_id`, `first_name`, `last_name`) VALUES
        (1, 'John', 'Doe'),
        (2, 'Pen', 'Poe'),
        (3, 'Robert', 'Roe');
    
    INSERT INTO `categories` (`category_id`, `name`) VALUES
        (1, 'Category 1'),
        (2, 'Category 2'),
        (3, 'Category 3'),
        (4, 'Category 4');
    
    INSERT INTO `posts` (`post_id`, `category_id`, `author_id`, `title`, `text`) VALUES
        (1, 1, 1, 'title 1', 'text 1'),
        (2, 1, 2, 'title 2', 'text 2');
    
    EXPLAIN SELECT p.post_id, p.title, p.text, c.category_id, c.name, u.user_id, u.first_name, u.last_name
    FROM posts AS p
    JOIN categories AS c
    ON c.category_id = p.category_id
    JOIN users AS u
    ON u.user_id = p.author_id
    WHERE p.category_id = 1