SQL優化隨記(一)建表

来源:http://www.cnblogs.com/Linlive/archive/2017/02/16/6405160.html
-Advertisement-
Play Games

SQL優化隨記(一)建表 關鍵字:多表OR單表,索引,分區分表 (1)多表OR單表(寫下個人經驗) 多表的優點(相對單表) 1. 規範,方便管理閱讀; 2. 可優化減少表記錄數量; 3. 可減輕對應表的查詢IO消耗。 多表的缺點(相對單表) 1. 查詢時,需經常使用統計函數,資源消耗較大; 2. 表 ...


SQL優化隨記(一)建表

關鍵字:多表OR單表,索引,分區分表

(1)多表OR單表(寫下個人經驗)

  • 多表的優點(相對單表)
  1. 規範,方便管理閱讀;
  2. 可優化減少表記錄數量;
  3. 可減輕對應表的查詢IO消耗。
  • 多表的缺點(相對單表)
  1. 查詢時,需經常使用統計函數,資源消耗較大;
  2. 表設計時,要求較高(需要考慮欄位關聯標準和資料庫框架的實現)。

闡述(啰嗦):一切從實際需求出發,綜合考慮。例如:經常需要查詢統計的表可以使用單表的模式,不考慮範式啥的,使用率較高的合計數據使用欄位(金額,數量等)裝入。目前使用單表的例子比較多,多用於mysql。

(2)索引

  • 唯一索引:唯一欄位,可有效提高查詢效率
  • 普通索引:根據實際情況,經常使用的查詢條件可添加(估計提高30%
  • 可以有效降低查詢耗費, 減少CPU消耗(執行計劃可以體現,彩筆者曾經見過一個查詢直接讓CPU達到99%)
  • 註意事項:
    1.索引欄位不能為空,否則失效
    2.索引欄位只要是有範圍數據,一般情況下都可以走索引(所以in是走索引的)
    3.不盲目建立索引,影響DDL操作的效率
    4.索引可以優化排序,貼個簡單的demo

    1.建立表和數據,執行索引:
    create table test_01 (
       xx number(6),
       oo number(6)
    
    2.建立索引
    create index idx_01 on test_01(xx asc,oo asc);
    
    3.準備數據
    begin 
      for i in 1..100 
            loop
              insert into test_01(xx,oo)
              values(i,101-i);
            end loop;
            commit;
        end;
    
    4.執行查詢
    select xx,oo 
    from test_01 
    where xx between 1 and 50 and oo between 50 and 99
    order by xx asc,oo asc;

    5.查看執行計劃
    如圖所示,執行計划去除了排序計劃,無序再排序了

(3)分表分區

  • 分表,彩筆者認為更多的還是在於制定策略
    舉個慄子:
    把一個業務表分成5個,假設寫入的業務數據與用戶數據相關聯,以此為基礎:
    策略由後臺代碼執行,簡單的將用戶ID(主鍵int)對5求餘,餘數的值既代表記錄應該寫入哪張表(餘1寫入1表,以此類推)
  • 分區,oracle和mysql都支持分區的建立,彩筆者雖然以前使用oracle,但是目前使用的是mysql,所以這裡以mysql為例。
    再舉個慄子:
    分區儘量在建立表的時候就開始制定策略建立,否則後期修改建立分區會鎖表,影響線上操作
    創建一個表,以年份為主分區,以月份為子分區,年份寫死為2016~2031(相信一個項目可以跑十多年,應該也可以下線了)

     CREATE TABLE `test02` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `image_url` varchar(100) DEFAULT NULL ,
      `create_date` date NOT NULL ,
      `create_month` TINYINT DEFAULT 0 ,
        PRIMARY KEY(`id`,create_date,create_month)
        )ENGINE=InnoDB AUTO_INCREMENT=2  DEFAULT CHARSET=utf8
        PARTITION BY RANGE (year(create_date))
        SUBPARTITION BY HASH (create_month) 
        SUBPARTITIONS 12 (
            PARTITION p2016 VALUES LESS THAN (2017),
            PARTITION p2017 VALUES LESS THAN (2018),
            PARTITION p2018 VALUES LESS THAN (2019),
            PARTITION p2019 VALUES LESS THAN (2020),
            PARTITION p2020 VALUES LESS THAN (2021),
            PARTITION p2021 VALUES LESS THAN (2022),
            PARTITION p2022 VALUES LESS THAN (2023),
            PARTITION p2023 VALUES LESS THAN (2024),
            PARTITION p2024 VALUES LESS THAN (2025),
            PARTITION p2025 VALUES LESS THAN (2026),
            PARTITION p2026 VALUES LESS THAN (2027),
            PARTITION p2027 VALUES LESS THAN (2028),
            PARTITION p2028 VALUES LESS THAN (2029),
            PARTITION p2029 VALUES LESS THAN (2030),
            PARTITION p2030 VALUES LESS THAN (2031),
            PARTITION pmax VALUES LESS THAN MAXVALUE
        );

    備註:將id,create_date,create_month同時作為主鍵的原因是:不這麼做會mysql會報錯:[Err] 1503 - A PRIMARY KEY must include all columns in the table's partitioning function;具體可以參考mysql提供的官方文檔
    查看(分區)執行計劃(1)

     EXPLAIN PARTITIONS SELECT * from test02;

    如表partitons所示:查詢了所有分區

    查看(分區)執行計劃(2)

    添加查詢條件,包括年份和月份
    EXPLAIN PARTITIONS  
        SELECT * from test02 
        where CREATE_date >  '2016-01-01' 
        and CREATE_date < '2016-03-01' 
        and create_month in (1,2);

    如表partitons所示:查詢了兩個分區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • phpMyAdmin提示“無法在發生錯誤時創建會話,請檢查 PHP 或網站伺服器日誌,並正確配置 PHP 安裝。” ...
  • 先貼上解決方案截圖 一、新建4個解決方案文件夾 1-Presentation 2-Application 3-Domain 4-Infrastructure 二、在解決方案文件夾中分別創建項目 新建.NET Core Web應用程式,【身份驗證】需要選擇【個人用戶賬戶】否則無法執行migration ...
  • 1.緩存池 MySQL的設計是通過緩存池的方式的,也就是說將一部分的數據都儲存到記憶體中,當我們查找一個數據的時候,如果發現在緩存池中的時候,就能夠直接的從緩存中獲取,如果不在的話,那麼就去磁碟中載入.所以建議資料庫伺服器採用64位的操作系統,這樣就能夠使用很大的記憶體。下麵的一些參數是設置記憶體池的: ...
  • elasticsearch-5.2.1安裝方法 1. 安裝java 右擊【我的電腦】 【屬性】 【高級系統設置】 【環境變數】,如圖: 選擇【新建系統變數】--彈出“新建系統變數”對話框,在“變數名”文本框輸入“JAVA_HOME”,在“變數值”文本框輸入JDK的安裝路徑(也就是步驟5的文件夾路徑) ...
  • 環境:REHL6.5 軟體:rpmbuild 使用到的文件:ALiSQL-Master 一、安裝所需要的軟體 [root@alisql ~]# yum install rpm* rpm-build rpmdev* –y[root@alisql ~]# rpmdev-setuptree[root@al... ...
  • 採用偽分佈模式安裝和設置CDH,前提是已經安裝了Java和SSH。 1. 下載hadoop-2.6.0-cdh5.9.0,複製到/opt/下,再解壓; 2. 進入/opt/hadoop-2.6.0-cdh5.9.0/etc/hadoop/,在hadoop-env.sh中添加: 修改配置文件core- ...
  • Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程式員往往只需定義好了POJO 到資料庫表的映射關係,即可通過Hibernate 提供的方法完成持久層操作。程式員甚至不需要對SQL 的熟 ...
  • mysql的索引是通過B+tree的方式的。B+tree是平衡二叉樹的變種,所以查詢的速度是非常快的。(B+tree :https://zh.wikipedia.org/zh-hans/B%2B%E6%A0%91) 索引主要分為聚集索引和輔助索引: 聚集索引:mysql中的數據是通過主鍵的聚集索引儲 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...