亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中SQL查詢常見調(diào)優(yōu)方案對比與實踐

 更新時間:2025年07月01日 08:41:17   作者:淺沫云歸  
文章瀏覽閱讀429次,點贊3次,收藏2次。本文從索引優(yōu)化、查詢重寫、分庫分表、緩存方案四個角度,對SQL調(diào)優(yōu)進行對比分析,并結(jié)合真實生產(chǎn)環(huán)境案例驗證了各方案的應(yīng)用效果,為后端開發(fā)者提供實用的最佳實踐指導。

問題背景介紹

在大型互聯(lián)網(wǎng)或企業(yè)級應(yīng)用中,數(shù)據(jù)庫往往成為系統(tǒng)性能的瓶頸。隨著數(shù)據(jù)量和并發(fā)量的增長,單一的 SQL 查詢可能出現(xiàn)響應(yīng)遲緩、鎖等待、全表掃描等性能問題。為保證系統(tǒng)的穩(wěn)定性和用戶體驗,需要對 SQL 查詢做深入的調(diào)優(yōu)。常見的調(diào)優(yōu)手段包括索引優(yōu)化、查詢重寫、分庫分表、緩存方案等。本文將從多種方案入手,對比分析各自優(yōu)缺點,并結(jié)合真實生產(chǎn)環(huán)境案例展示調(diào)優(yōu)效果。

多種解決方案對比

方案 A:索引優(yōu)化

  • 原理:為頻繁篩選或排序的列建立合適的索引,避免全表掃描。
  • 實現(xiàn):使用 B-Tree、哈希索引或覆蓋索引。

示例:為訂單表的 user_idcreated_at 建聯(lián)合索引:

ALTER TABLE orders 
  ADD INDEX idx_user_created (user_id, created_at DESC);

使用 EXPLAIN 查看執(zhí)行計劃:

EXPLAIN SELECT * FROM orders 
 WHERE user_id = 1234 
 ORDER BY created_at DESC
 LIMIT 10;

方案 B:查詢重寫與分頁優(yōu)化

  • 原理:通過拆分復雜 SQL,避免大范圍排序與聯(lián)表;優(yōu)化分頁查詢。
  • 實現(xiàn):利用覆蓋索引分頁、二次過濾或游標。

示例:傳統(tǒng)高頁碼分頁會嚴重影響性能:

SELECT * FROM orders 
 WHERE user_id = 1234 
 ORDER BY created_at DESC 
 LIMIT 100000, 20;

重寫為“基于最后讀取位置的分頁”:

-- 前一頁最后一行的 created_at 值
SET @last_time = '2024-07-01 12:34:56';

SELECT * FROM orders
 WHERE user_id = 1234
   AND created_at < @last_time
 ORDER BY created_at DESC 
 LIMIT 20;

方案 C:分區(qū)表 & 分庫分表

  • 原理:通過按時間或用戶 ID 手動/自動劃分表或數(shù)據(jù)庫,減少單表或單庫數(shù)據(jù)量。
  • 實現(xiàn):MySQL 原生分區(qū)、Proxy 層分片、ShardingSphere 等。

示例:按月份進行分區(qū):

ALTER TABLE orders
  PARTITION BY RANGE (TO_DAYS(created_at)) (
    PARTITION p202407 VALUES LESS THAN (TO_DAYS('2024-08-01')),
    PARTITION p202408 VALUES LESS THAN (TO_DAYS('2024-09-01'))
);

方案 D:緩存層(Redis)

  • 原理:將熱點查詢結(jié)果緩存在內(nèi)存中,減少數(shù)據(jù)庫壓力。
  • 實現(xiàn):使用 Redis 哈希、Sorted Set 或自定義緩存策略。

示例:通過 Spring Cache 簡單集成:

@Service
public class OrderService {
  @Cacheable(value = "orderList", key = "#userId")
  public List<Order> getRecentOrders(long userId) {
    return orderMapper.findByUserOrderByCreatedAt(userId, 20);
  }
}

各方案優(yōu)缺點分析

方案優(yōu)點缺點
索引優(yōu)化最基礎(chǔ)、低成本;即插即用;顯著減少全表掃描建索引占用空間;寫入性能略有下降;對復雜查詢提升有限
查詢重寫針對性強;可解決分頁等特定問題代碼層復雜度上升;需分析不同場景重寫策略
分區(qū)/分表支撐超大規(guī)模數(shù)據(jù);單表/單庫規(guī)??煽?/td>設(shè)計和運維復雜;跨分區(qū)/跨庫查詢難;可能導致跨庫事務(wù)問題
緩存層減少數(shù)據(jù)庫壓力;提升響應(yīng)速度緩存一致性、熱點失效、二級緩存上下文復雜

選型建議與適用場景

數(shù)據(jù)量中等(百萬級)且查詢模式穩(wěn)定:優(yōu)先考慮 方案 A:索引優(yōu)化方案 B:查詢重寫。低成本、風險小。

業(yè)務(wù)增長迅速、表數(shù)據(jù)量突破千萬甚至億級:結(jié)合 方案 C:分區(qū)表/分庫分表。大型電商、日志系統(tǒng)等。

熱點數(shù)據(jù)重復訪問高:在以上方案基礎(chǔ)上引入 方案 D:緩存層。防止緩存雪崩采用雙層緩存或預熱策略。

混合場景:可按業(yè)務(wù)模塊拆分策略(OLTP 與 OLAP 分離),或采用 HTAP 數(shù)據(jù)庫(如 TiDB)兼顧多種需求。

實際應(yīng)用效果驗證

場景:電商訂單列表查詢

  • 典型 SQL:按照用戶查詢、按下單時間倒序分頁。
  • 初始數(shù)據(jù):orders 表記錄量 5000 萬,按頁碼分頁時 5000 頁后響應(yīng)時間超 2s。

優(yōu)化前 EXPLAIN:

+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table  | type | possible_keys | key  | rows    | Extra                |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | orders | ALL  | NULL          | NULL | 50000000| Using filesort       |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
  • 方案 A 索引優(yōu)化:新增 (user_id, created_at) 聯(lián)合索引后,響應(yīng)時間降至 200ms。
  • 方案 B 分頁重寫:基于 created_at 游標分頁,5000 頁查詢 95% 都在 50ms 內(nèi)完成。
  • 方案 C 分庫分表:按用戶哈希分 8 庫后,最慢頁響應(yīng) < 100ms。
  • 方案 D Redis 緩存:熱點前 100 頁結(jié)果均在 5ms 內(nèi)返回。

綜合來看,方案 A + 方案 B 是快速見效的低成本首選;方案 C + 方案 D 可結(jié)合應(yīng)對超高并發(fā)與 PB 級數(shù)據(jù)量。

到此這篇關(guān)于MySQL中SQL查詢常見調(diào)優(yōu)方案對比與實踐的文章就介紹到這了,更多相關(guān)SQL查詢調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql-8.0.11-winx64.zip安裝教程詳解

    mysql-8.0.11-winx64.zip安裝教程詳解

    這篇文章主要介紹了mysql-8.0.11-winx64.zip安裝教程詳解及注意事項,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2018-05-05
  • MySQL-tpch 測試工具簡要手冊

    MySQL-tpch 測試工具簡要手冊

    tpch是TPC(Transaction Processing Performance Council)組織提供的工具包。用于進行OLAP測試,以評估商業(yè)分析中決策支持系統(tǒng)(DSS)的性能。它包含了一整套面向商業(yè)的ad-hoc查詢和并發(fā)數(shù)據(jù)修改,強調(diào)測試的是數(shù)據(jù)庫、平臺和I/O性能,關(guān)注查詢能力
    2016-05-05
  • MySQL 原理與優(yōu)化之Update 優(yōu)化

    MySQL 原理與優(yōu)化之Update 優(yōu)化

    這篇文章主要介紹了MySQL 原理與優(yōu)化之Update 優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08
  • mysql5.1.26安裝配置方法詳解

    mysql5.1.26安裝配置方法詳解

    這篇文章主要為大家詳細介紹了mysql安裝配置方法,圖文詳解MySQL5.1.26安裝步驟,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 將MySQL數(shù)據(jù)庫移植為PostgreSQL

    將MySQL數(shù)據(jù)庫移植為PostgreSQL

    PostgreSQL 作為功能最強勁的開源 OO 數(shù)據(jù)庫,仿佛一直不為國內(nèi)用戶所熟識。而我個人也僅是因為工作的緣故接觸到這款超經(jīng)典的數(shù)據(jù)庫,并深為之折服。
    2009-07-07
  • mysql 詳解隔離級別操作過程(cmd)

    mysql 詳解隔離級別操作過程(cmd)

    這篇文章主要介紹了mysql 詳解隔離級別操作過程(cmd)的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • MySQL Json類型字段IN查詢分組優(yōu)化

    MySQL Json類型字段IN查詢分組優(yōu)化

    這篇文章主要為大家介紹了MySQL Json類型字段IN查詢分組優(yōu)化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • MySQL聯(lián)合查詢實現(xiàn)方法詳解

    MySQL聯(lián)合查詢實現(xiàn)方法詳解

    聯(lián)合查詢union將多次查詢(多條select語句)的結(jié)果,在字段數(shù)相同的情況下,在記錄的層次上進行拼接,這篇文章主要給大家介紹了關(guān)于Mysql聯(lián)合查詢的那些事兒,需要的朋友可以參考下
    2022-11-11
  • MySQL中Nested-Loop Join算法小結(jié)

    MySQL中Nested-Loop Join算法小結(jié)

    數(shù)據(jù)庫中JOIN操作的實現(xiàn)主要有三種:嵌套循環(huán)連接(Nested Loop Join),歸并連接(Merge Join)和散列連接或者哈稀連接(Hash Join)。其中嵌套循環(huán)連接又視情況又有兩種變形:塊嵌套循環(huán)連接和索引嵌套循環(huán)連接。
    2015-12-12
  • MySQL在讀已提交和可重復讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明

    MySQL在讀已提交和可重復讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明

    這篇文章主要介紹了MySQL在讀已提交和可重復讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評論