哪个更快,全表扫描还是建立索引?

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近在 HN 上看到一个帖子:全表扫描优于建索引的情况,看了一下作者原文 ,还挺有趣的,分享给大家。

有时为了方便快速搜索大量数据,一种方法是建立索引进行预处理,这样搜索只需要查看一小部分数据。然而,值得建立索引的门槛可能比你想象的要高。以下是我经历过的全表扫描反而更好的案例:

  • 十年前我为一个小型计费服务编写了一个内部通信应用程序。消息存储在 MySQL 中,如果全表搜索变慢或者遇到负载问题的时候,我就会添加索引;但即使有 10 年的消息需要搜索,在没有安装和维护 Sphinx(当时MySQL 还不支持 InnoDB FULLTEXT 索引,v5.6 之后才加上)情况下它还是能保持响应。
  • 我最近发现有人维护了一个 0.5GB 的全文索引来搜索他 shell 历史记录中 100k 个命令。我在平面文件上用 grep,测试了一下,现在查询我 180k 历史条目需要 200ms
  • 我的 contra 舞蹈搜索工具 根据查询对每个舞蹈进行排名,并且没有地理空间索引,因为其实只有 ~350 个舞蹈。
  • 我最近工作的时候会用一个病毒计数浏览器 来实时检索人类病毒分类树,用 JS 的 includes 命令扫描约 15k 名称几乎就跟你打字速度一样快。
  • 我在广告业 (小编注:作者曾在 Google Ads 上班) 工作时,我经常需要使用生产日志来调试问题,并使用 Dremel (Melnik 2010, Melnik 2020) 分布式扫描大量数据,速度非常快。因为查询相对较少,所以维护索引的成本要高得多。

除非你从一开始就知道会搜索数亿条记录,否则请考虑从简单扫描开始,并仅在性能难以接受时添加索引。即使这样,在查询较少且变化较大的情况下,在摄入时间而不是查询时间方面做些改进可能效果更好。


💡 你可以访问官网,免费注册云账号,立即体验 Bytebase。

PostgreSQL全表扫描慢到崩溃?建索引+改查询+更统计信息三招能破? title: PostgreSQL全表扫描慢到崩溃?建索引+改查询+更统计信息三招能破?summary:全表扫描在PostgreSQL中会逐行读取表数据,适用于小表,但对大表会导致性能问题。查询规划器通过生成候选计划、计算代价并选择最优执行计划来优化查询。避免全表扫描的核心是为关键列创建索引,如WHERE子句、JOIN条件和排序/分组列。查询语句应避免前缀通配符、列函数和隐式类型转换,使用显式JOIN。 阅读详情

相关推荐

既要Like %x%,又要索引,是否可以兼得?全表扫描 or 全索引扫描

索引扫描or全表扫描索引遇到Like模糊查询会发生什么?

HeiSeXingYe的博客 556

MySQL - 索引优化

MySQL 索引优化 即不重复的索引值和表记录总数的比值,索引的选择性越高则查询效率越高,因为选择性高的索引可以让 MySQL 在查找时过滤掉更多的行。

迪曼奥特迦-博客 1503

数据库优化<八>SQL优化之SELECT优化 ——避免全表扫描

数据库操作中,一个全表扫描(full table scan)可能是整个应用的瓶颈,因此,我们尽量 要避免不必要的全表扫描。而如果你发现一条sql是全表扫描,一般的解决步骤是:         1、运行执行计划获得具体的sql语句查询分析:                    方法:explain sql;                    分析:至少能或得这些信息,1、表的join

xiaobing的专栏 5637

MySQL高级 全表扫描更快

如果MySQL评估使用索引全表更慢,则不使用索引

Leon_Jinhai_Sun的博客 340

面试系列MySql:索引优化

面试系列MySql:索引优化

CancerKing的博客 678

Oracle(73)什么是索引扫描(Index Scan)和全表扫描(Full Table Scan)?

全表扫描索引扫描数据库系统中两种主要的检索数据的方法。全表扫描适用于小表或需要访问大部分数据的查询,而索引扫描适用于大表和选择性高的查询。通过创建合适的索引,可以显著提高查询性能。了解如何生成和分析执行计划,可以帮助识别查询的执行路径和性能瓶颈,从而采取相应的优化措施。

qq_43012298的博客 1405

mysql 全表扫描一定比索引性能差吗

本文通过一个例子深入剖析了 MySQL 的执行计划是如何选择的,以及为什么它的选择未必是我们认为的最优的,这也提醒我们,在生产中如果有多个索引的情况,使用 WHERE 进行过滤未必会选中你认为的索引,我们可以提前使用 EXPLAIN, optimizer trace 来优化我们的查询语句。

weixin_40279159的博客 624

什么时候全表扫描比使用索引扫描更快

伟大的Oracle SQL优化器可以判断出在某些情况下,使用全表扫描比使用索引扫描更快的得到数据结果。 有没有想过,她是怎么做到的呢? 背后的原理是什么呢? 举一个非常好理解的场景(scenario:通过索引读取表中20%的数据)解释一下这个有趣的概念: 假设一张表含有10万行数据--------100000行 我们要读取其中20%(2万)行数据----20000行 表中每行

cs34443的专栏 4629

MySQL如何避免全表扫描

全表扫描通常在查询数据库时消耗大量资源,尤其是当表中的数据行数非常多时。避免全表扫描可以显著提高数据库查询的性能和效率。以下是一些有效的策略来避免全表扫描

常备不懈 2987

为什么有时全表扫描比通过索引扫描效率更高

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34220834的博客 1726

mysql在扫描情况下会选择全表扫描而不是索引

1.有一张表t_account CREATE TABLE `t_account` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT '', `age` int DEFAULT '0', `phone` varchar(20) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `goods` int DEFAULT '0', `update_time` d

乐乐的博客 4372

索引是什么?全表扫描是什么?两者的区别在哪里

帮助快速定位数据,类似书的目录(可以直接翻到第50页,而不用一页页找)。常见的索引类型:B+树索引(MySQL)、哈希索引(Redis)等。(比如查整张表的80%数据,用索引反而更慢)。如果表有100万行,就要查100万次,耗时。,适合无索引或小表查询,速度慢但简单直接。(数据量少时,全表扫描可能比索引更快)。,适合精确查找,速度快但占用空间。(如用户ID、订单号、手机号)。数据库先去索引(B+树)查找。(尤其对主键、唯一键查询)。,直到找到符合条件的数据。(索引本身也是数据)。(索引需要同步更新)。

2301_80170889的博客 650

【mysql】全表扫描过程 & 聚簇索引 区别和联系

InnoDB的数据是保存在主键索引上的,所以全表扫描实际上是直接扫描表t的主键索引。 如果没有主键,聚簇索引就会优先存在唯一索引、隐藏列 参考: 《Mysql缓存-全表扫描过程、LRU算法》

m0_45406092的博客 2823

Oracle - 全表扫描索引扫描,适用场景分析

Oracle 全表扫描索引扫描:核心差异与适用场景解析 摘要 本文深入分析Oracle数据库全表扫描(FTS)与索引扫描的核心差异及适用场景。全表扫描并非"笨方法",其优势在于: 高数据量低选择性查询(如过滤条件匹配95%数据时) 小表访问(<20个数据块) 无合适索引覆盖的查询 并行查询场景 索引扫描则包含多种子类型(唯一扫描、范围扫描、快速全扫描等),其效率取决于: 索引选择性(理想值>5%) 回表开销(可能成为性能瓶颈) 索引聚簇因子(影响物理I/O量) 文章通过Java JDBC示例演示了如何捕

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

MySQL全表扫描一定存在性能问题吗?

MySQL 执行计划中出现全表扫描,并不一定代表查询存在性能问题,也可能是 MySQL 优化器经过分析之后的正确选择。常见的应用案例包括数据量很少的小表,数据仓库中的聚合分析等。

Tony.Dong的专栏 1730

关于索引,我们可以知道的更多 --全表扫描索引扫描

关于索引,我们可以知道的更多 --全表扫描索引扫描 先建一个简单的表结构 createtabletest(aint,bdatetime) createindexidx_bontest(b) 再来点测试数据 declare@iint declare@xint set@i=0 set@x=0 while(...

MRman0404的博客 239

Oracle 数据库在哪些情况下会放弃索引扫描而转为全表扫描

优化器选择全表扫描并非总是坏事。它的选择是基于成本的理性决策。作为DBA开发者,我们需要理解其背后的原理,通过检查表的大小、查询条件、索引质量(特别是集群因子)和统计信息来判断这个选择是否合理。如果不合理(例如本该用索引却没用),再针对性地进行优化,如修改SQL、创建更合适的索引或刷新统计信息。

ITHomeZSL的博客 512

MySQL怎么判断索引还是全表扫描

引入:我们在查询有索引的字段时,有时候会发现居然没有索引,而是全表扫描。这是为什么呢? 因为MySQL发现全表扫描会比索引更快,因此选择了全表扫描。 MySQL是怎么判断索引快还是全表扫描快的呢?这里需要补充几个知识 聚簇索引和非聚簇索引。 聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。 非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置 innodb中,在聚簇索引上创建的索引都称为辅助索引(复合索引,前缀索引,唯一索引)。辅助索引

ht1301584915的博客 2523
上一篇: Bytebase VS Archery
下一篇: 好物分享|在 Mac 上启动本地数据库实例的免费工具
Bytebase
博客等级 码龄5年 1240粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值