【字節跳動】數據挖掘面試題0014:SQL中count(1), count(*), count(列)區別

文章大綱

    • SQL 中 `count(1)`、`count(*)`、`count(某列)` 的區別
      • 一、核心定義與行為差異
      • 二、示例說明差異
      • 三、性能差異與優化
      • 四、適用場景建議
      • 五、面試應答要點
      • 六、索引掃描與全表掃描
        • 1. 索引掃描的觸發條件
        • 2. 全表掃描的適用場景
        • 3. 常見面試問題點
          • Q1:索引掃描一定比全表掃描快嗎?
          • `Q2:如何判斷數據庫是否選擇索引掃描?`
          • Q3:索引選擇性對掃描方式的影響?
          • Q4:如何優化索引掃描?
          • Q5:數據庫如何選擇掃描方式?
        • 4. 示例對比分析
          • 總結

SQL 中 count(1)count(*)count(某列) 的區別

在 SQL 中,count() 是常用的聚合函數,但 count(1)count(*)count(某列) 的語義和性能存在細微差異,這也是面試中的高頻考點。以下從定義、行為、性能和適用場景四個維度詳細解析:
在這里插入圖片描述

一、核心定義與行為差異

語法定義是否忽略 NULL
count(*)統計 所有行 的數量,無論列值是否為 NULL
count(1)對每行插入一個常量值 1,然后統計 1 的數量,本質與 count(*) 相同。
count(某列)統計指定列中非 NULL 值的數量。

二、示例說明差異

假設有表 students 如下:

idnameage
1Alice20
2BobNULL
3NULL22
4NULLNULL
  • SELECT count(*):結果為 4(統計所有行)。
  • SELECT count(1):結果為 4(統計所有行)。
  • SELECT count(name):結果為 2(僅統計 name 列非 NULL 的行)。
  • SELECT count(age):結果為 2(僅統計 age 列非 NULL 的行)。

在這里插入圖片描述

三、性能差異與優化

  1. count(*)count(1)

    • 多數數據庫(如 MySQL、PostgreSQL):二者執行效率完全相同,優化器會將 count(1) 視為 count(*)
    • 少數數據庫(如 Oracle)count(1) 在特定索引掃描時可能略快,但差異可忽略不計。
  2. count(某列)

    • 無索引:需逐行掃描,檢查列值是否為 NULL,效率較低。
    • 有索引若統計的列存在索引,數據庫可能直接通過索引樹快速統計非 NULL 值(無需掃描全量數據行)

四、適用場景建議

  1. 統計總行數
    推薦使用 count(*),語義清晰且性能最優。

  2. 統計非空值數量
    使用 count(某列),例如統計用戶表中填寫了郵箱的用戶數:

    SELECT count(email) FROM users;
    
  3. 性能優化場景

    • 若需頻繁統計非空值,可為該列添加索引。
    • 避免在 count() 中使用表達式(如 count(column+1)),會強制全表掃描。
  4. 關鍵區別總結

    函數統計范圍是否包含 NULL性能建議
    COUNT(*)所有行? 是?? 最優
    COUNT(1)所有行(同 COUNT(*)? 是等同 COUNT(*)
    COUNT(列)指定列的非 NULL? 否需檢查列值

五、面試應答要點

  1. 行為差異

    • count(*)count(1) 統計所有行,count(某列) 僅統計非 NULL 值。
  2. 性能考量

    • count(*)count(1) 性能無顯著差異。
    • count(某列) 若有索引則可能更快,否則可能慢于 count(*)
  3. 數據庫特定優化

    • MySQL 對 count(*) 有特殊優化,即使表無索引也可能快速返回結果(依賴存儲引擎)。
    • Oracle 在大表上 count(1) 可能略優于 count(*)(需結合執行計劃分析)。

示例場景
假設用戶表 users 有 100 萬行數據,其中 email 列有 20% 的 NULL 值:

  • SELECT count(*):返回 100 萬。
  • SELECT count(email):返回 80 萬。
  • email 列有索引,count(email) 可能比 count(*) 更快(索引掃描比全表掃描高效)。

六、索引掃描與全表掃描

在數據庫中,索引掃描(Index Scan)比全表掃描(Table Scan)更高效的核心場景是:當查詢只需訪問少量數據時。以下是詳細分析和常見面試考點:
在這里插入圖片描述

1. 索引掃描的觸發條件

索引掃描通常在以下情況觸發:

  • 過濾條件有效:查詢的WHERE子句包含索引列(如WHERE age > 30),且過濾后的數據量較小(通常認為占全量數據的5-10%以下)
  • 覆蓋索引查詢所需的字段(如SELECT id, age)全部包含在索引中,無需回表查詢
  • 索引有序性:查詢需要排序(如ORDER BY age),且索引本身有序(避免額外排序操作)。
2. 全表掃描的適用場景

全表掃描通常在以下情況更優:

  • 過濾條件不高效:例如WHERE name LIKE '%張%'左模糊無法利用索引)。
  • 查詢大部分數據:例如WHERE age > 10若大部分數據滿足條件,全表掃描可能更快)。
  • 無合適索引:查詢字段未建立索引,或索引選擇性低(如性別字段)。
3. 常見面試問題點
Q1:索引掃描一定比全表掃描快嗎?

A:不一定。

  • 反例:當查詢需要返回大部分數據(如WHERE age > 10),全表掃描可能更快。因為索引掃描需先訪問索引,再回表查詢數據,若數據量過大,IO成本反而更高
Q2:如何判斷數據庫是否選擇索引掃描?

A:通過執行計劃(如MySQL的EXPLAIN)查看:

  • type字段為indexrange表示使用索引掃描。
  • type字段為ALL表示全表掃描。
Q3:索引選擇性對掃描方式的影響?

A:索引選擇性(Unique Ratio)指索引列中不同值的數量與總行數的比例。

  • 高選擇性(如用戶ID):索引掃描效率高。
  • 低選擇性(如性別):可能導致優化器放棄索引,選擇全表掃描。
Q4:如何優化索引掃描?

A

  • 創建復合索引(如(age, gender))覆蓋常用查詢。
  • 避免索引冗余(如已有(a, b)索引,無需單獨創建(a)索引)。
  • 使用覆蓋索引減少回表。
Q5:數據庫如何選擇掃描方式?

A:優化器基于以下因素估算成本:

  • 索引選擇性和統計信息。
  • 表數據量和分布。
  • 內存和IO性能。
4. 示例對比分析

假設表users有100萬行數據,age列有索引:

查詢場景掃描方式原因
WHERE age = 20(1萬行)索引掃描過濾后數據量小,索引掃描效率高。
WHERE age > 10(90萬行)全表掃描過濾后數據量大,全表掃描避免多次IO。
SELECT id, age WHERE age=20索引掃描(覆蓋)索引包含所有所需字段,無需回表。
SELECT * WHERE name LIKE '%張%'全表掃描左模糊無法利用索引。
總結
  • 索引掃描優勢過濾少量數據、覆蓋索引、利用有序性
  • 全表掃描優勢:查詢大量數據、無合適索引、過濾條件低效。
  • 核心原則索引是為了減少IO,若索引掃描的IO成本反而更高,優化器會選擇全表掃描

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88399.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88399.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux面試問題-軟件測試

1、你在上一家公司常用的Linux命令有哪些?答:使用vim/vi編輯文件,使用cat,more,less,head查看文件,使用grep過濾日志中的error,使用ps查看進程,使用top查看實時進程,netstat查看端口…

時序數據庫的存儲之道:從數據特性看技術要點

時序數據的獨特挑戰時序數據(Time-Series Data)是指按時間順序記錄的一系列數據點,在物聯網、金融、工業監控等領域無處不在。與傳統數據相比,時序數據具有幾個鮮明特點:時間導向性:每個數據點都帶有精確的時間戳高寫入量&#xf…

【vim中替換】

vim中替換1 : s/在Vim中經常高頻使用到的命令:1 : s/ :s 命令的基本語法是 :[range]s/{pattern}/{string}/[flags],其中: ? [range] 是可選的范圍,用于指定替換的行范圍。例如,% 表示全文,10,…

Qt實戰:使用QSqlDatabase連接MySQL,并實現增刪改查

文章目錄一、創建數據表二、連接MySQL數據庫三、封裝成一個完整的輕量級 ORM 風格類四、實現派生具體模型類五、支持多線程連接池 ORM 事務封裝一、創建數據表 數據庫名: 我們先創建一個數據庫,名字叫 game_db: CREATE DATABASE IF NOT E…

Python腳本保護工具庫之pyarmor使用詳解

概要 PyArmor是一個專門為Python代碼提供加密保護的第三方庫,旨在解決Python源代碼易被反編譯和泄露的安全問題。作為一種動態代碼保護工具,PyArmor能夠對Python腳本進行混淆和加密處理,有效防止源代碼被惡意獲取、分析或篡改。該庫特別適用于商業軟件開發、知識產權保護和…

倉頡編程語言:從入門到精通

為啥要瞅瞅倉頡這玩意兒? 有一說一,現在的編程語言多得跟米一樣,對吧?那一門新語言想火,沒點絕活兒肯定不行。倉頡(Cangjie)這哥們兒,是華為搞出來的新玩意兒,靜態編譯的…

線性探針是什么:是一種用于探測神經網絡中特定特征的工具

線性探針是什么 線性探針是一種在機器學習和相關領域廣泛應用的技術,用于評估預訓練模型特征、檢測數據中的特定序列等。在不同的應用場景下,線性探針有著不同的實現方式和作用: 評估預訓練模型特征:在機器學習中,線性探針是一種評估預訓練模型“特征遷移能力”的標準化方…

【論文閱讀】Few-Shot PPG Signal Generation via Guided Diffusion Models

從少量樣本數據選擇到后處理的整體框架。首先,擴散模型在N樣本數據集和指導下的訓練。接著,模型生成一個增強的數據集,并進一步優化以提高保真度。最后,這些合成數據與少量樣本訓練數據集結合,用于基準模型的訓練和評估。數據分布從最初的紅色變為保真度增強的藍色,這表明…

CentOS-7的“ifupdown“與Debian的“ifupdown“對比 筆記250706

CentOS-7的"ifupdown"與Debian的"ifupdown"對比 筆記250706 CentOS 7 和 Debian 的 ifupdown 工具名稱相同,但在實現機制、配置文件語法和系統集成上存在顯著差異。以下是核心對比分析: ?? 一、核心差異概覽 對比維度CentOS 7De…

架構如傳承:技術長河中的可持續樂章

代碼結構:協作基石 在軟件開發的世界里,代碼結構就如同建筑的框架,支撐著整個項目的運行。想象一下,你加入了一個新的開發團隊,接手一個已經有一定規模的項目。當你打開代碼庫,看到的是一團亂麻般的代碼&a…

Ubuntu22.04更新Openssh至9.9p2無法正常連接,報錯解決

Ubuntu22.04更新Openssh至9.9p2無法正常連接,報錯解決 1.報錯信息如下所示ExecStart/usr/sbin/sshd -D $SSHD_OPTS (codeexited, status255/EXCEPTION)2.這通常說明 SSH 配置文件存在語法錯誤、缺失關鍵文件,或者端口被占用等問題。 3.檢查配置文件是否有…

基于小程序的智能停車管理系統設計與開發

項目介紹 本課程演示的是一款基于小程序的智能停車管理系統設計與開發,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3…

多模態大語言模型arxiv論文略讀(155)

Panther: Illuminate the Sight of Multimodal LLMs with Instruction-Guided Visual Prompts ?? 論文標題:Panther: Illuminate the Sight of Multimodal LLMs with Instruction-Guided Visual Prompts ?? 論文作者:Honglin Li, Yuting Gao, Chengl…

SAP ERP與Oracle EBS對比,兩個ERP系統有什么區別?

據統計,2024年中國ERP軟件市場規模預計突破210億元,其中SAP和Oracle占據第一梯隊,共占國內ERP市場45%以上的份額,在高端市場尤其顯著。SAP和Oracle作為ERP行業的兩大巨頭,具體有什么區別呢?SAP是什么&#…

網絡安全之RCE分析與利用詳情

Gogs背景介紹Gogs(Go Git Service)是一款用Go語言編寫的輕量級、開源的Git倉庫托管系統。它的設計目標是讓搭建和維護Git服務變得簡單、快速,同時提供類似GitHub的功能,但對資源消耗更少,適合個人或者小型團隊使用&…

OpenCV圖片操作100例:從入門到精通指南(2)

接上篇,本文將繼續分享OpenCV實用技巧,涵蓋圖像處理、目標檢測、3D視覺等進階領域!六、圖像變換進階17. 圖像金字塔# 高斯金字塔下采樣 smaller cv2.pyrDown(img)# 高斯金字塔上采樣 larger cv2.pyrUp(img)用于多尺度圖像處理,構…

2、Connecting to Kafka

KafkaAdmin-請參閱配置主題ProducerFactory-請參閱發送消息ConsumerFactory-請參閱接收消息從2.5版本開始&#xff0c;每個版本都擴展了KafkaResourceFactory。這允許在運行時通過向引導服務器的配置中添加Supplier<String>來更改引導服務器&#xff1a;setBootstrapServ…

二進制部署CentOS8.5+Kubernetes1.33.2+Docker28.3.1高可用集群

Kubernetes 集群部署202507 本實驗主要軟件環境及資源如下&#xff1a; 二進制部署CentOS8.5Kubernetes1.33.2Docker28.3.1高可用集群 一、系統要求 ?Kubermetes 系統由一組可執行程序組成&#xff0c;用戶可以通過Kubernetes在GitHub 的項目網站下載編譯好的二進制文件或…

127. Java 泛型 - 泛型類與子類型

文章目錄127. Java 泛型 - 泛型類與子類型1. 泛型類和接口的子類型化示例&#xff1a;ArrayList 和 List2. 自定義泛型接口的子類型化示例&#xff1a;泛型接口的子類型解釋3. 泛型類和接口的類型參數4. 總結127. Java 泛型 - 泛型類與子類型 1. 泛型類和接口的子類型化 在 J…

內網服務器怎么設置公網遠程訪問? windows桌面連接和Linux自帶SSH外網異地跨網用完整步驟教程

沒有公網IP的本地主機跨網訪問是經常需要用到的網絡場景。要設置內網服務器在公網進行異地遠程訪問&#xff0c;需依次完成確保網絡連接正常、配置防火墻、啟用遠程訪問服務、和利用類似nat123內網映射外網打通等一系列步驟&#xff0c;以保障不同內網的遠程訪問的順利進行。一…