自製小工具大大加速MySQL SQL語句優化(附源碼)

2020-09-05 異步社區

優化SQL,是DBA常見的工作之一。如何高效、快速地優化一條語句,是每個DBA經常要面對的一個問題。在日常的優化工作中,我發現有很多操作是在優化過程中必不可少的步驟。然而這些步驟重複性的執行,又會耗費DBA很多精力。於是萌發了自己編寫小工具,提高優化效率的想法。

那選擇何種語言來開發工具呢?

對於一名DBA來說,掌握一門語言配合自己的工作是非常必要的。相對於shell的簡單、perl的飄逸,Python是一種嚴謹的高級語言。其具備上手快、語法簡單、擴展豐富、跨平臺等多種優點。很多人把它稱為一種「膠水」語言,通過大量豐富的類庫、模塊,可以快速搭建出自己需要的工具。

於是乎,這個小工具就成了我學習Python的第一個作業,我把它稱之為「MySQL語句優化輔助工具」。而且從此以後,我深深愛上了Python,並開發了很多資料庫相關的小工具,以後有機會介紹給大家。

一、優化手段、步驟

下面在介紹工具使用之前,首先說明下MySQL中語句優化常用的手段、方法及需要注意的問題。這也是大家在日常手工優化中,需要了解掌握的。

1、執行計劃 — EXPLAIN命令

執行計劃是語句優化的主要切入點,通過執行計劃的判讀了解語句的執行過程。在執行計劃生成方面,MySQL與Oracle明顯不同,它不會緩存執行計劃,每次都執行「硬解析」。查看執行計劃的方法,就是使用EXPLAIN命令。

1)基本用法

EXPLAIN QUERY

當在一個Select語句前使用關鍵字EXPLAIN時,MySQL會解釋了即將如何運行該Select語句,它顯示了表如何連接、連接的順序等信息。

EXPLAIN EXTENDED QUERY

當使用EXTENDED關鍵字時,EXPLAIN產生附加信息,可以用SHOW WARNINGS瀏覽。該信息顯示優化器限定SELECT語句中的表和列名,重寫並且執行優化規則後SELECT語句是什麼樣子,並且還可能包括優化過程的其它註解。在MySQL5.0及更新的版本裡都可以使用,在MySQL5.1裡它有額外增加了一個過濾列(filtered)。

EXPLAIN PARTITIONS QUERY

顯示的是查詢要訪問的數據分片——如果有分片的話。它只能在MySQL5.1及更新的版本裡使用。

EXPLAIN FORMAT=JSON (5.6新特性)

另一個格式顯示執行計劃。可以看到諸如表間關聯方式等信息。

2)輸出欄位

下面說明一下EXPLAIN輸出的欄位含義,並由此學習如何判斷一個執行計劃。

id

MySQL選定的執行計劃中查詢的序列號。如果語句裡沒有子查詢等情況,那麼整個輸出裡就只有一個SELECT,這樣一來每一行在這個列上都會顯示一個1。如果語句中使用了子查詢、集合操作、臨時表等情況,會給ID列帶來很大的複雜性。如上例中,WHERE部分使用了子查詢,其id=2的行表示一個關聯子查詢。

select_type

語句所使用的查詢類型。是簡單SELECT還是複雜SELECT(如果是後者,顯示它屬於哪一種複雜類型)。常用有以下幾種標記類型。

  • DEPENDENT SUBQUERY

子查詢內層的第一個SELECT,依賴於外部查詢的結果集。

  • DEPENDENT UNION

子查詢中的UNION,且為UNION中從第二個SELECT開始的後面所有SELECT,同樣依賴於外部查詢的結果集。

  • PRIMARY

子查詢中的最外層查詢,注意並不是主鍵查詢。

  • SIMPLE

除子查詢或UNION之外的其他查詢。

  • SUBQUERY

子查詢內層查詢的第一個SELECT,結果不依賴於外部查詢結果集。

  • UNCACHEABLE SUBQUERY

結果集無法緩存的子查詢。

  • UNION

UNION語句中的第二個SELECT開始後面的所有SELECT,第一個SELECT為PRIMARY。

  • UNION RESULT

UNION中的合併結果。從UNION臨時表獲取結果的SELECT。

  • DERIVED

衍生表查詢(FROM子句中的子查詢)。MySQL會遞歸執行這些子查詢,把結果放在臨時表裡。在內部,伺服器就把當做一個&34;那樣來引用,因為臨時表就是源自子查詢。

table

這一步所訪問的資料庫中表的名稱或者SQL語句指定的一個別名表。這個值可能是表名、表的別名或者一個為查詢產生的臨時表的標識符,如派生表、子查詢或集合。

type

表的訪問方式。以下列出了各種不同類型的表連接,依次是從最好的到最差的。

  • system

系統表,表只有一行記錄。這是const表連接類型的一個特例。

  • const

讀常量,最多只有一行匹配的記錄。由於只有一行記錄,優化程序裡該行記錄的欄位值可以被當作是一個恆定值。const用於在和PRIMARY KEY或UNIQUE索引中有固定值比較的情形。

  • eq_ref

最多只會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問。從該表中會有一行記錄被讀取出來以和從前一個表中讀取出來的記錄做聯合。與const類型不同的是,這是最好的連接類型。它用在索引所有部分都用於做連接並且這個索引是一個PRIMARY KEY或UNIQUE類型。eq_ref可以用於在進行&34;做比較時檢索欄位。比較的值可以是固定值或者是表達式,表達示中可以使用表裡的欄位,它們在讀表之前已經準備好了。

  • ref

JOIN語句中驅動表索引引用的查詢。該表中所有符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄作聯合。ref用於連接程序使用鍵的最左前綴或者是該鍵不是PRIMARY KEY或UNIQUE索引(換句話說,就是連接程序無法根據鍵值只取得一條記錄)的情況。當根據鍵值只查詢到少數幾條匹配的記錄時,這就是一個不錯的連接類型。ref還可以用於檢索欄位使用&34;操作符來比較的時候。

  • ref_or_null

與ref的唯一區別就是在使用索引引用的查詢之外再增加一個空值的查詢。這種連接類型類似ref,不同的是MySQL會在檢索的時候額外的搜索包含NULL值的記錄。這種連接類型的優化是從MySQL 4.1.1開始的,它經常用於子查詢。

  • index_merge

查詢中同時使用兩個(或更多)索引,然後對索引結果進行合併(merge),再讀取表數據。這種連接類型意味著使用了Index Merge優化方法。

  • unique_subquery

子查詢中的返回結果欄位組合是主鍵或唯一約束。

  • index_subquery

子查詢中的返回結果欄位組合是一個索引(或索引組合),但不是一個主鍵或唯一索引。這種連接類型類似unique_subquery。它用子查詢來代替IN,不過它用於在子查詢中沒有唯一索引的情況下。

  • range

索引範圍掃描。只有在給定範圍的記錄才會被取出來,利用索引來取得一條記錄。

  • index

全索引掃描。連接類型跟ALL一樣,不同的是它只掃描索引樹。它通常會比ALL快點,因為索引文件通常比數據文件小。MySQL在查詢的欄位知識單獨的索引的一部分的情況下使用這種連接類型。

  • fulltext

全文索引掃描。

  • all

全表掃描。

possible_keys

該欄位是指MySQL在搜索表記錄時可能使用哪個索引。如果沒有任何索引可以使用,就會顯示為null。

key

查詢優化器從possible_keys中所選擇使用的索引。key欄位顯示了MySQL實際上要用的索引。當沒有任何索引被用到的時候,這個欄位的值就是NULL。

key_len

被選中使用索引的索引鍵長度。key_len欄位顯示了MySQL使用索引的長度。當key欄位的值為NULL時,索引的長度就是NULL。

ref

列出是通過常量,還是某個表的某個欄位來過濾的。ref欄位顯示了哪些欄位或者常量被用來和key配合從表中查詢記錄出來。

rows

該欄位顯示了查詢優化器通過系統收集的統計信息估算出來的結果集記錄條數。

Extra

該欄位顯示了查詢中MySQL的附加信息。

filtered

這個列式在MySQL5.1裡新加進去的,當使用EXPLAIN EXTENDED時才會出現。它顯示的是針對表裡符合某個條件(WHERE子句或聯接條件)的記錄數的百分比所作的一個悲觀估算。

3) SQL改寫

EXPLAIN除了可以顯示執行計劃外,還可以顯示SQL改寫。所謂SQL改寫,是指MySQL在對SQL語句進行優化前,會基於一些原則進行語句的改寫,以方便後面的優化器進行優化生成更優的執行計劃。該功能是通過EXPLAIN EXTENDED+SHOW WARNINGS配合使用。下面通過示例說明一下。


從上面示例中,可看到原有語句中的IN子查詢被改寫成為表間關聯的方式。

2、統計信息

查看統計信息也是優化語句中必不可少的一步。通過統計信息可以快速了解對象的存儲特徵如何。下面說明主要的兩類統計信息——表、索引。

1) 表統計信息 — SHOW TABLE STATUS


  • Name:表名
  • Engine:表的存儲引擎類型(ISAM、MyISAM或InnoDB)
  • Row_format:行存儲格式(Fixed-固定的、Dynamic-動態的或Compressed-壓縮的)
  • Rows:行數量。在某些存儲引擎中,例如MyISAM和ISAM他們存儲了精確的記錄數。不過其他存儲引擎中,它可能只是近似值。
  • Avg_row_length:平均行長度。
  • Data_length:數據文件的長度。
  • Max_data_length:數據文件的最大長度。
  • Index_length:索引文件的長度。
  • Data_free:已分配但未使用了字節數。
  • Auto_increment:下一個autoincrement(自動加1)值。
  • Create_time:表被創造的時間。
  • Update_time:數據文件最後更新的時間。
  • Check_time:最後對表運行一個檢查的時間。執行mysqlcheck命令後更新,僅對MyISAM有效。
  • Create_options:額外留給CREATE TABLE的選項。
  • Comment:當創造表時,使用的注釋(或為什麼MySQL不能存取表信息的一些信息)。
  • Version:數據表的&39;文件版本號。
  • Collation:表的字符集和校正字符集。
  • Checksum:實時的校驗和值(如果有的話)。

3、索引統計信息 — SHOW INDEX


  • Table:表名。
  • Non_unique:0,如果索引不能包含重複。
  • Key_name:索引名
  • Seq_in_index:索引中的列順序號,從1開始。
  • Column_name:列名。
  • Collation:列怎樣在索引中被排序。在MySQL中,這可以有值A(升序)或NULL(不排序)。
  • Cardinality:索引中唯一值的數量。
  • Sub_part:如果列只是部分被索引,索引字符的數量。當整個欄位都做索引了,那麼它的值是NULL。
  • Packed:表示鍵值是如何壓縮的,NULL表示沒有壓縮。
  • Null:當欄位包括NULL的記錄是YES,它的值為,反之則是&39;。
  • Index_type:使用了哪種索引算法(有BTREE、FULLTEXT、HASH、RTREE)。
  • Comment:備註。
  • 系統參數:系統參數也會影響語句的執行效率。查看系統參數,可使用SHOW VARIABLES命令。

1) 參數說明

系統參數很多,下面介紹幾個。

sort_buffer_size

排序區大小。其大小直接影響排序使用的算法。如果系統中排序都比較大、內存充足且並發量不是很大的情況,可以適當增加此參數。這個參數是針對單個Thead的。

join_buffer_size

Join操作使用內存區域大小。只有當Join是ALL、index、range或index_merge時使用到Join Buffer。如果join語句較多,可以適當增大join_buffer_size。需要注意到是,這個值針對單個Thread。每個Thread都會自己創建獨立的Buffer,而不是整個系統共享的Buffer,不要設置過大而造成系統內存不足。

tmp_table_size

如果內存內的臨時表超過該值,MySQL自動將它轉換為硬碟上的MyISAM表。如果執行許多高級GROUP BY查詢並且有大量內存,則可以增加tmp_table_size的值。

read_buffer_size

讀查詢操作所能使用的緩衝區大小。這個參數是針對單個Thead的。

4、優化器開關

在MySQL中,還有一些參數是可以用來控制優化器行為的。

1) 參數說明

optimizer_search_depth

這個參數控制優化器在窮舉執行計劃時的限度。如果查詢長時間處於&34;狀態,可以考慮調低此參數。

optimizer_prune_level

默認是打開的,這讓優化器會根據需要掃描的行數來決定是否跳過某些執行計劃。

optimizer_switch

這個變量包含了一些開啟/關閉優化器特性的標誌位。

示例 — 幹預優化器行為(ICP特性)


默認情況下,ICP特性是開啟的。查看一下優化器行為。


基於二級索引的過濾查詢,使用了ICP特性,從Extra中的」Using index condition」可見。如果通過優化器開關,幹預優化器行為,又會如何呢?


從Extra可見,ICP特性已經禁用。

5、系統狀態(SHOW STATUS)

MySQL中也內置了一些狀態,通過這些狀態變量也可反映出語句執行的一些情況,方便定位問題。手工執行的話,可以在執行語句的前後分別執行SHOW STATUS命令,查看狀態的變化。當然,因狀態變量很多,對比起來不太方便,後面我介紹的小工具,可以解決這個問題。

1) 狀態變量

狀態變量很多,這裡介紹幾個。

Sort_merge_passes

排序算法已經執行的合併的數量。如果這個變量值較大,應考慮增加sort_buffer_size系統變量的值。

Sort_range

在範圍內執行的排序的數量。

Sort_rows

已經排序的行數。

Sort_scan

通過掃描表完成的排序的數量。

Handler_read_first

索引中第一條被讀的次數。讀取索引頭的次數,如果這個值很高,說明全索引掃描很多。

Handler_read_key

根據鍵讀一行的請求數。如果較高,說明查詢和表的索引正確。

Handler_read_next

按照鍵順序讀下一行的請求數。如果你用範圍約束或如果執行索引掃描來查詢索引列,該值增加。

Handler_read_prev

按照鍵順序讀前一行的請求數。

Handler_read_rnd

根據固定位置讀一行的請求數。如果執行大量查詢並需要對結果進行排序該值較高。則可能使用了大量需要MySQL掃描整個表的查詢或連接沒有正確使用鍵。

Handler_read_rnd_next

在數據文件中讀下一行的請求數。如果正進行大量的表掃描,該值較高。通常說明表索引不正確或寫入的查詢沒有利用索引。

6、SQL性能分析器(Query Profiler)

MySQL的Query Profiler是一個使用非常方便的Query診斷分析工具,通過該工具可以獲取一條Query在整個執行過程中多種資源的消耗情況,如CPU、IO、IPC、SWAP等,以及發生的PAGE FAULTS、CONTEXT SWITCHE等,同時還能得到該Query執行過程中的MySQL所調用的各個函數在源文件中的位置。

1) 使用方法

開啟

mysql> select @@profiling;mysql> set profiling=1;

默認情況下profiling的值為0表示MySQL SQL Profiler處於OFF狀態,開啟SQL性能分析器後profiling的值為1。

執行SQL語句

mysql> select count(*) from t1;

獲取概要信息

使用&34;命令獲取當前系統中保存的多個Query的profile的概要信息。

mysql> show profiles;+----------+------------+-----------------------+| Query_ID | Duration | Query |+----------+------------+-----------------------+| 1 | 0.00039300 | select count(*) from t1 |+----------+------------+-----------------------+

針對單個Query獲取詳細的profile信息

在獲取概要信息之後,就可以根據概要信息的Query_ID來獲取某個Query的執行過程中詳細的profile信息。

mysql> show profile for query 1;mysql> show profile cpu,block io for query 1;

二、工具說明

前面談到了多種手段,對於SQL語句的調優都有所幫助。通過下面這個小工具,可以自動調用命令將上面這些內容一次性推給DBA,大大加速優化的過程。

1、準備條件

模塊 - MySQLDB

模塊 - sqlparse

Python版本 = 2.7.3 (2.6.x版本應該也沒問題,3.x版本沒測試)

2、調用方法

python mysql_tuning.py -p tuning_sql.ini -s &39;

1) 參數說明

-p 指定配置文件名稱

-s 指定SQL語句

3、配置文件

共分兩節信息,分別是[database]描述資料庫連接信息,[option]運行配置信息。

1) [database]

server_ip = 127.0.0.1db_user = testuserdb_pwd = testpwddb_name = test

2) [option]

sys_parm = ON //是否顯示系統參數sql_plan = ON //是否顯示執行計劃obj_stat = ON //是否顯示相關對象(表、索引)統計信息ses_status = ON //是否顯示運行前後狀態信息(激活後會真實執行SQL)sql_profile = ON //是否顯示PROFILE跟蹤信息(激活後會真實執行SQL)

4、輸出說明

1) 標題部分

包含運行資料庫的地址信息及數據版本信息。


2) 原始SQL

用戶執行輸入的SQL,這部分主要是為了後續對比SQL改寫時使用。語句顯示時使用了格式化。


3) 系統級參數

腳本選擇顯示了部分與SQL性能相關的參數。這部分是寫死在代碼中的,如需擴展需要修改腳本。


4) 優化器開關

下面是和優化器相關的一些參數,通過調整這些參數可以人為幹預優化器行為。


5) 執行計劃

就是調用explain extended的輸出結果。如果結果過長,可能出現顯示串行的問題(暫時未解決)。


6) 優化器改寫後的SQL

通過這裡可判斷優化器是否對SQL進行了某種優化(例如子查詢的處理)。


7) 統計信息

在SQL語句中所有涉及到的表及其索引的統計信息都會在這裡顯示出來。


8) 運行狀態信息

在會話級別對比了執行前後的狀態(SHOW STATUS),並將出現變化的部分顯示出來。需要注意的是,因為收集狀態數據是採用SELECT方式,會造成個別指標的誤差(例如Com_select)。


9) PROFILE詳細信息

調用SHOW PROFILE得到的詳細信息。


10) PROFILE匯總信息

根據PROFILE的資源消耗情況,顯示不同階段消耗對比情況(TOP N),直觀顯示&34;所在。


源碼文件下載地址:https://pan.baidu.com/s/1slF3zS5?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=

相關焦點

  • MySQL資料庫SQL語句優化原理專題(一)
    看SQL語句的執行計劃想要知道自己寫的sql語句是否最優,是否有性能問題,最直接的辦法,就是看SQL語句的執行計劃,下面先看一下如何獲取SQL語句的執行計劃。要優化left join的sql語句,先了解一下沒有任何索引的情況下,left join的工作原理
  • MySQL如何定位慢sql?
    MySQL「慢SQL」定位資料庫調優我個人覺得必須要明白兩件事1.定位問題(你得知道問題出在哪裡,要不然從哪裡調優呢)2.解決問題(這個沒有基本的方法來處理,因為不同的問題處理的方式方法不一樣,得從實踐中不斷的探索,如sql調優,配置優化,硬體升級等等)
  • MySQL數據恢復工具binlog2sql
    binlog2sql是一個開源的Python開發的MySQL Binlog解析工具,能夠將Binlog解析為原始的SQL,也支持將Binlog解析為回滾的SQL,以便做數據恢復。shell> pip install -r requirements.txtMySQL Server的配置:MySQL的配置,必須滿足以下要求,才能正常使用binlog2sql工具。開啟binlog,binlog格式必須為ROW,且binlog_row_image必須為full。
  • MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL
    定位慢查詢SQL在平時工作中,我想你肯定遇到過一條sql發出去了,但是等了好久才出現了返回值,這不僅僅影響了測試速度也大大降低了開發效率。所以我們有必要學習sql慢查詢定位。發現慢查詢及時優化或者提醒開發改寫。一般測試環境建議 long_query_time 設置的閥值比生產環境的小,比如生產環境是 1 秒,則測試環境建議配置成 0.5 秒。便於在測試環境及時發現一些效率低的 SQL。甚至某些重要業務測試環境 long_query_time 可以設置為 0,以便記錄所有語句。
  • 實戰:從Mysql資料庫frm文件,提取表結構創建SQL語句
    在某些特殊的場景下,例如你的mysql資料庫無法啟動,需要你將表的ibd文件拷貝到另一個資料庫中,恢復業務資料庫,恢復業務數據的前提,是你需要在另一個資料庫中,創建好一模一樣的表結構。這時你就需要從Mysql資料庫的frm文件中,提取表結構創建sql語句。
  • mysql┃多個角度說明sql優化,讓你吊打面試官!
    sql優化,最近moon一直在寫關於mysql的文章,包括之前寫的索引相關,其實也都是為了這篇文章做個鋪墊,所以你懂了嗎,今天我將從表結構、索引、查詢語句、分庫分表這四個維度來和大家聊聊,在工作中,怎麼進行sql優化?
  • Mysql 性能調優之sql和索引優化
    結論:在執行常量等值查詢時,改變索引列的順序並不會更改explain的執行結果,因為mysql底層優化器會進行優化,但是推薦按照索引順序列編寫sql語句。語句mysql底層優化器會進行優化:範圍右邊索引列失效(c4右邊已經沒有索引列了),注意索引的順序(c1,c2,c3,c4),所以c4右邊不會出現失效的索引列,因此4個索引全部用上。
  • 使用explain和show profile來分析SQL語句實現優化SQL語句
    SQL語句優化是建立在慢查詢分析的基礎上,通過慢查詢定位有問題的SQL語句,關於慢查詢的介紹及其分析工具,可以參考[mysql慢查詢及慢查詢日誌分析工具]一、通過explain查詢1 用法:explain sql2 作用:用於分析sql語句(1)、id:執行explain的一個編號(沒有實際意義)(2)、
  • 聊聊Mysql——慢sql優化方法論
    總結了一些解決慢sql的方法,供參考。一、慢sql優化訂閱每日慢日誌,優先解決調用次數多的慢sql,因慢sql優化的知識點非常多,只列舉幾個容易忽視的地方。5、合理的設置資料庫連接池的參數,設置sql語句的timeout,查詢量大的地方,需要有降級開關。
  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • SQL性能優化,書寫高質量SQL語句
    寫SQL語句的時候我們往往關注的是SQL的執行結果,但是是否真的關注了SQL的執行效率,是否注意了SQL的寫法規範?以下的乾貨分享是在實際開發過程中總結的,希望對大家有所幫助!1. limit分頁優化當偏移量特別大時,limit效率會非常低。
  • MySQL優化SQL語句的步驟
    我們在執行一條SQL語句的時候,如果我們想要知道這條SQL語句查詢了哪些表,有沒有使用索引,獲取數據的時候遍歷了多少行數據,我們可以通過EXPLAIN命令來查看這些執行信息,這些執行信息統稱為執行計劃。1.使用 EXPLAIN 查看執行計劃使用方式 explain sql。下面對圖中的每一個欄位進行說明。
  • mysql基礎之sql語句分類及實際中的用途
    顯得專業你會拿到公司的Offer,顯得專業客戶就信服你,顯得專業領導就欣賞你,反正就是各種好處,今天咱們就來講一講mysql專業一點的東西,提升一下逼格。上節課中老韓說「select * from student」這是sql語句,sql語句是什麼呢?
  • 書寫高性能SQL語句技巧,網友都說好
    作為一名程式設計師,少不了要寫一些sql語句,但每個人寫出來的sql執行效率還是有差距的,功力深厚的人,寫的sql簡潔而且高效,初學者,往往只是實現功能,至於性能問題,可能無從下手。在這裡我將之前在sql優化方面的一些技巧和高效寫法,給大家總結了一下,不說能百分百解決sql性能問題,基本上能解決百分之八十以上的sql性能問題。
  • mysql資料庫常用的SQL語句匯總
    set charset gbk; 黑窗口中sql語句必須寫分號,代表一個語句的結束,客戶端不用寫分號。 客戶端中的注釋:--空格 # 2種方式 多行注釋 /*.....空格 */<6>創建資料庫 create database 資料庫名字;分號為結束符,不可缺。
  • 分享一個好用的SQL的優化工具soar及安裝過程
    SOAR(SQL Optimizer And Rewriter)是由小米人工智慧雲平臺的資料庫團隊開發的,一個對SQL進行優化的自動化工具。主要特點:1)、支持基於啟發式算法的語句優化。2)、支持複雜查詢的多列索引優化。3)、支持執行計劃(EXPLAIN)信息解讀。
  • 全網都說這那的mysql高級優化,為什麼不從寫sql開始呢?
    ,空閒之餘,我就想著整理一下mysql優化的內容。就從剛開始寫sql語句開始,除了能夠學到優化的內容之外,還可以回顧一下當年的青澀sql,來看一下吧理論知識我們先來回顧一下基礎的知識,方便後面講解優化的時候,可以更好地去學習和理解MySQL 的運行機制
  • MySQL客戶端功能及SQL
    MySQL客戶端功能及SQL簡介連接資料庫連接服務端參數簡介-u 指定用戶-p 指定密碼-S 指定Sock文件-h 指定主機名稱-P 指定埠-e 不交互,執行sql語句< 導入數據source
  • 8個mysql基本知識點梳理和查詢優化
    基本用法1、desc 或者 explain 加上你的sql2、extended explain加上你的sql,然後通過show warnings可以查看實際執行的語句,這一點也是非常有用的,很多時候不同的寫法經過sql分析之後實際執行的代碼是一樣的提高性能的特性1、索引覆蓋(covering
  • 一文了解Mysql的慢日誌,以及使用慢日誌分析工具
    Mysql的慢日誌是mysql提供的一種日誌記錄,它用來記錄在mysql中響應時間超過閾值的語句,具體指運行時間超過配置文件中long_query_time:表示響應時間操作3秒的將會被記錄這個值也可以在配置文件my.cnf中配置,下面我們就模擬一條慢sql,mysql中有一個睡眠函數sleep,那就執行一條睡眠4秒的語句。