mysql優化的一些基本語法

来源:http://www.cnblogs.com/xinboke/archive/2016/04/22/5422093.html
-Advertisement-
Play Games

1.慢SQL消耗了70%~90%的資料庫CPU資源; 2.SQL語句獨立於程式設計邏輯,相對於對程式源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低; 3.SQL語句可以有不同的寫法; 下麵是我總結的一些SQL常見的優化方法,每個案例都簡單易懂,在開發過程中可以作為參考: 不使用子查詢 ...


1.慢SQL消耗了70%~90%的資料庫CPU資源;

2.SQL語句獨立於程式設計邏輯,相對於對程式源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低;

3.SQL語句可以有不同的寫法;

下麵是我總結的一些SQL常見的優化方法,每個案例都簡單易懂,在開發過程中可以作為參考:

 

不使用子查詢

 

例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');
子查詢在MySQL5.5版本里,內部執行計劃器是這樣執行的:先查外表再匹配內表,而不是先查內表t2,當外表的數據很大時,查詢速度會非常慢。
在MariaDB10/MySQL5.6版本里,採用join關聯方式對其進行了優化,這條SQL會自動轉換為
SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但請註意的是:優化只針對SELECT有效,對UPDATE/DELETE子查詢無效,固生產環境應避免使用子查詢

 

避免函數索引

 

例:SELECT * FROM t WHERE YEAR(d) >= 2016;
由於MySQL不像Oracle那樣支持函數索引,即使d欄位有索引,也會直接全表掃描。
應改為----->
SELECT * FROM t WHERE d >= '2016-01-01';

 

用IN來替換OR

 

 

 

低效查詢
SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
----->
高效查詢
SELECT * FROM t WHERE LOC_IN IN (10,20,30);

 

LIKE雙百分號無法使用到索引

SELECT * FROM t WHERE name LIKE '%de%';
----->
SELECT * FROM t WHERE name LIKE 'de%';
目前只有MySQL5.7支持全文索引(支持中文)

 

讀取適當的記錄LIMIT M,N

 

 

SELECT * FROM t WHERE 1;
----->
SELECT * FROM t WHERE 1 LIMIT 10;

 

避免數據類型不一致

 

 

SELECT * FROM t WHERE id = '19';
----->
SELECT * FROM t WHERE id = 19;

 

分組統計可以禁止排序

 

 

SELECT goods_id,count(*) FROM t GROUP BY goods_id;
預設情況下,MySQL對所有GROUP BY col1,col2...的欄位進行排序。如果查詢包括GROUP BY,想要避免排序結果的消耗,則可以指定ORDER BY NULL禁止排序。
----->
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

 

避免隨機取記錄

 

 

 

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
MySQL不支持函數索引,會導致全表掃描
----->
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4; 

 

禁止不必要的ORDER BY排序

 

 

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
----->
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

 

 

 

批量INSERT插入

 

 

 

INSERT INTO t (id, name) VALUES(1,'Bea');
INSERT INTO t (id, name) VALUES(2,'Belle');
INSERT INTO t (id, name) VALUES(3,'Bernice');
----->
INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');

 


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

-Advertisement-
Play Games
更多相關文章
  • 程式的實現需要藉助幾個對象: NSURLRequest:建立了一個請求,可以指定緩存策略、超時時間。和NSURLRequest對應的還有一個NSMutableURLRequest,如果請求定義為NSMutableURLRequest則可以指定請求方法(GET或POST)等信息。 NSURLConne ...
  • 1、場景 1.1 最新三次的提交 分別是:定義了一個變數k = 10 、 定義了一個變數 j = 6 、 定義了一個變數 i = 5 ; 本地倉庫 和 遠程倉庫保持一致 1.2 我添加了一行代碼 如何回退版本到最近的一次,也就是 定義一個變數 k = 10 這個版本 ? 回退的結果 已經回到我們想要 ...
  • 我們在Service(Ⅰ)中瞭解了Service最基本的知識點,今天我們繼續學習Service這個組件(神器)。 先來說一下Service的生命周期:跟Activity相比,Service的生命周期就太簡單了:onCreate()->onStart()->onDestroy() 【主題】:Activ ...
  • 在程式開始以#開頭的命令,他們是預編譯命令。有三類預編譯命令:巨集定義命令、文件包含命令、條件編譯命令;今天聊聊巨集定義: 巨集定義命令將一個標識符定義為一個字元串,源程式中的該標識符均以指定的字元串來代替。因此預處理命令後通常不加分號。這並不是說所有的預處理命令後都不能有分號出現。由於巨集定義只是用巨集名對 ...
  • HTTP原理 1. 什麼是URL 在介紹HTTP之前,我們對URL有一定的瞭解的,因為只有通過URL我們才能拿到網路上的資源。那麼究竟什麼是URL? URL(Uniform Resource Locator 統一資源定位符):URL其實就是資源在互聯網上的地址、位置,互聯網上的每一個資源都有一個唯一 ...
  • <TextView android:id="@+id/desc" android:layout_width="match_parent" android:layout_height="130px" android:lineSpacingExtra="2px" android:textColor="@ ...
  • 1、表的修改: 1.1 刪除列:ALTER TABLE 表名 DROP COLUMN 列名 1.2 添加列:ALTER TABLE 表名 ADD(列名 數據類型) 1.3 修改列名:ALTER TABLE 表名 RENAME COLUMN 舊列名 TO 新列名 1.4 修改列的數據類型:ALTER ...
  • oracle_11g有32位和64位兩個版本,64位的電腦可以裝32位的版本,但是32位的電腦不可以裝64位,如果你是64位的,建議你裝64位的版本。 安裝包下載 32位 http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...