我真正感兴趣的是MySQL索引是如何工作的,更具体地说,它们如何在不扫描整个表的情况下返回请求的数据?

我知道这是离题的,但如果有人能向我详细解释这一点,我将非常非常感谢.

推荐答案

基本上,一个表上的索引就像一本书中的索引一样工作(这就是名字的来源):

假设你有一本关于数据库的书,你想找到一些关于存储的信息.如果没有索引(假设没有其他帮助,比如目录),你必须一页一页地浏览,直到找到主题(这是full table scan).

当然,索引的有用程度取决于很多事情——使用上面的比喻,举几个例子:

  • 如果你有一本关于数据库的书,并为"数据库"这个词编制了索引,你会看到第1-59页、第61-290页和第292-400页都提到了它.在这种情况下,索引没有多大帮助,逐个浏览页面可能会更快(在数据库中,这是" Select 性差").
  • 对于一本10页的书来说,建立索引是没有意义的,因为你最终可能会得到一本10页的书,前面加上一个5页的索引,这太傻了——只需扫描10页就可以了.
  • 索引也需要有用——通常没有索引的意义,例如每页字母"L"的频率.

Mysql相关问答推荐

try 恢复数据库时,如何正确解决行大小太大消息?

如何重新采样SQL数据库

如何在产品查询中插入GROUP_CONCAT?

MySQL中如何对字符串进行算术运算?

使用 awk 重写 maxscale 过滤器

列出每年最多产的三位作家

如何更新一个巨大的表的 50k 行?

MySQL - 如何根据单列查找重复行?

MySQL函数 - 如何对select查询应用多个条件

为什么order by子句可以利用索引?

此更新查询是否有任何可能的重写选项?

在分组结果 MySQL 5.7 版中获取最多的重复值

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

SUBSTRING_INDEX 获取第 n 个值

MySql查询无结果

估计行数 SQL

MySQL查询/子句执行顺序

MySQL导入数据库但忽略特定表

匹配 IN 子句中的所有值

MySQL 1062 - 键 'PRIMARY' 的重复条目 '0'