mysql - 非唯一键查找和索引范围扫描有什么区别?
问题描述
我不知道非唯一键查找和索引范围扫描之间有什么区别,因为我认为它们都返回遵循运算符“=”o“<”之类的条件的行。
解决方案
WHERE x = 123 -- with INDEX(x)
将扫描 x=123 的所有行。它的性能与
WHERE y BETWEEN 22 and 33 -- with any kind of index on y
两者都将向下钻取索引的 BTree 以找到第一个匹配项。然后它将向前扫描,直到该值不再匹配。
但是,它们的工作方式不同:
WHERE x = 123 AND b >= 88
WHERE y BETWEEN 22 and 33 AND b >= 88
第一个可以利用INDEX(x,b)
。它定位第一个x=123 and b=88
,然后扫描直到x > 123
。
第二个不能做那样的事情。没有复合索引能真正同时处理y
和b
。
“索引范围扫描”和“表范围扫描”类似,但适用于不同的BTree。“表”包含在按顺序排序的 BTree 中PRIMARY KEY
,可以说,“表范围扫描”是“索引范围扫描”
“唯一键查找”和“非唯一键查找”的不同之处在于,唯一的可以在找到 1 行(或没有行)后停止,而非唯一的必须继续进行,直到出现不匹配的值遇到(或LIMIT
到达)。
推荐阅读
- c - poll() 和 EOF:重定向文件描述符并进行过滤
- php - 无法使用 PHP 将视频上传到 Facebook 页面,但可以使用 curl
- html - HTML 宽度属性在 Markdown 中不起作用
- javascript - 当部分出现在屏幕上时,AOS 动画不起作用
- c - CS 50 恢复分段故障
- azure-data-factory - DataFlow 无法读取存储在 Blob 存储中的 API 响应 json 文件
- scala - 重新分区和合并没有按预期工作
- internet-explorer - IE插件adobe flash停止支持后强制安装方法
- mysql - 将 SQL 字段内容从模式替换到行尾
- jaeger - 如何从 Jaeger 下载痕迹?