如果我对非索引字段进行查询,是不是使用全表扫描

Posted

技术标签:

【中文标题】如果我对非索引字段进行查询,是不是使用全表扫描【英文标题】:Is a full table scan used if I make a query on nonIndexed field如果我对非索引字段进行查询,是否使用全表扫描 【发布时间】:2021-05-23 15:55:20 【问题描述】:

如果我编写一个基于没有索引的字段进行搜索或排序的 mysql 查询,db 引擎是否必须进行全表扫描?

如果我在 Presto 或 Cassandra 中执行此操作会怎样?

【问题讨论】:

Trino(以前称为 Presto SQL)可以以分布式(因此:可扩展)方式对大量数据进行排序。为此,仍需要完全读取数据(全表扫描)。 【参考方案1】:

是的,您可以通过 MySQL 的 EXPLAIN statement 确认这一点,它显示了优化器计划如何访问表。

这是一个搜索索引列的示例,它告诉我它将使用哪个键(即索引)。

mysql> explain select * from mytable where idx_column=123\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mytable
   partitions: NULL
         type: ref
possible_keys: idx_column
          key: idx_column
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL

这是一个显示type: ALL 的示例,这意味着它必须检查表中的所有行。 IE。表扫描。

mysql> explain select * from mytable where non_idx_column=123\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mytable
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where

关于 EXPLAIN 的知识还有很多,所以我建议您在手册和博客中阅读它。

Presto 有自己的 EXPLAIN 版本 (https://prestodb.io/docs/current/sql/explain.html),输出的信息完全不同。

Cassandra 没有 EXPLAIN 语句,但您可以使用请求跟踪为您提供有关查询执行的一些不同类型的信息。进行表扫描可能会影响性能。见Issue in full table scan in cassandra

【讨论】:

【参考方案2】:

Presto 意味着 prestodb.io 没有索引。但如果谓词可以下推,则取决于正在读取基础数据的连接器。

例如,Hive 连接器(用于读取 HDFS 或 S3)相当成熟,可以下推谓词以减少 IO 量。

这是一个解释一些行为的博客:https://prestodb.io/blog/2019/12/23/improve-presto-planner

二字

【讨论】:

以上是关于如果我对非索引字段进行查询,是不是使用全表扫描的主要内容,如果未能解决你的问题,请参考以下文章

SQL中哪些情况会引起全表扫描

为啥 oracle 表索引但仍然进行全表扫描?

mysql 全表扫描场景

mysql查询优化

MySQL索引优化经验总结

大数据课堂0008会引起全表扫描的几种SQL 以及sql优化