開發人員MySQL調優-理論篇

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

修改字符集

查看字符集

show variables like 'character%'
show variables like '%char%'

上面的兩個命令都可以,我一般使用的下面的,會出來如下幾個字符集設定的選項:

character_set_client:客戶端請求數據的字符集character_set_connection:從客戶端接收到數據,然后傳輸的字符集character_set_database:默認數據庫的字符集,無論默認數據庫如何改變,都是這個字符集;如果沒有默認數據庫,那就使用?character_set_server指定的字符集,

? 這個變量建議由系統自己管理,不要人為定義。character_set_filesystem:把os上文件名轉化成此字符集,即把 character_set_client轉換character_set_filesystem, 默認binary是不做任何轉換的character_set_results:結果集的字符集character_set_server:數據庫服務器的默認字符集character_set_system:這個值總是utf8,不需要設置,是為存儲系統元數據的字符集

修改配置文件

? 修改/etc/my.cnf配置文件

在client下做如下一個選項的修改

[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
lower_case_table_names=1
max_connections=1000
[mysql]
default-character-set=utf8

配置文件

目前整個配置文件內容

[client]
default-character-set=utf8
[mysqld]
server-id=1
log-bin=mysql-bin
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
?
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
?
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
?
[mysql]
default-character-set=utf8

?

log-bin

? 定義主從復制文件前綴,后面生成的文件在datadir+logbin-filename

如:

? 里面不僅有log-bin文件,還有創建的數據庫對應的目錄等

log-error

? MySql的一些重要的數據信息都會在里面,日常運維監控都需要打開看看,例如將執行時間超過1秒的SQL輸出

datadir

  • frm文件-相當于表的元數據

  • myd文件-表的數據文件

  • myi文件-表的索引文件

SQL性能下降原因

可能問題

1.查詢語句寫的爛

? SQL關聯的表很多,條件很復雜,很多子查詢等,導致生成的執行計劃有問題而無法生成索引

2.索引失效

? 單值索引:索引建立在單列上

? 組合索引:索引建立在多個字段上,如果查詢的條件經常出現多列的同一個組合,那么創建組合索引非常高效

3.關聯查詢太多

? 現在硬件設備都已經起來的,數據庫表設計幾乎都不在嚴格遵循三范式,增加冗余,提高查詢速度,以空間換時間。不過這樣設計也有一些毛病,在做update的時候就必須修改更多的地方,否則會導致數據一致性問題

? 在分布式數據庫中,如果跨主機關聯太多,會導致大量的網絡通信,極大的增加了SQL執行時長

? 如果確實不得不關聯很多表,建議將一個大SQL拆分成小SQL,增強SQL執行計劃的穩定性

4.服務器調優

? 修改排序緩沖和數據緩沖大小,修改線程數大小

關聯查詢

SQL讀取執行順序

SELECT distinct column_list 
?FROM taba 
?JOIN tabb ON join_condition 
?WHERE where-condition 
?GROUP BY group-by-list 
?HAVING having-condition 
?ORDER BY order-by-condition 
?LIMIT limit-number

?

Mysql讀取順序

2225b65e8a07eff7f3150b2aa48bb2de776.jpg

9d0229ed544f60fa2046a29798e38e72cd9.jpg

先求關聯表的笛卡爾積——》得到主表結果數據——》做join,不符合on的數據也補充到結果中——》做條件過濾——》分組——》分組過濾——》結果集列篩選——》排序——》限定返回結果集

7中JOIN寫法

74e4d38dce40d3a69dc416c062d839e4b95.jpg

1.INNER JOIN 內連接

? SELECT <select_list>

? FROM taba a

? INNER JOIN tabb b

? ON a.key = b.key

2.LEFT JOIN 左外連接

? SELECT <select_list>

? FROM taba a

? LEFT JOIN tabb b

? ON a.key = b.key

3.RIGHT JOIN 右外連接

? SELECT <select_list>

? FROM taba a

? RIGHT JOIN tabb b

? ON a.key = b.key

4.LEFT JOIN 求差

? SELECT <select_list>

? FROM taba a

? LEFT JOIN tabb b

? ON a.key = b.key

? WHERE b.key is NULL

5.RIGHT JOIN 求差

? SELECT <select_list>

? FROM taba a

? RIGHT JOIN tabb b

? ON a.key = b.key

? WHERE a.key is NULL

6.FULL JOIN 求并集

? SELECT <select_list>

? FROM taba a

? FULL OUTER JOIN tabb b

? ON a.key = b.key

7.FULL JOIN 求非交叉結果集

? SELECT <select_list>

? FROM taba a

? FULL OUTER JOIN tabb b

? ON a.key = b.key

? WEHRE a.key is NULL OR b.key is NULL

索引

什么是索引

? 為了提高數據查詢速度而設計的數據結構,一般情況下這種數據結構都是B+樹(一顆已經排好序的樹)。查詢時,從樹的根節點開始比較,小于根的走左孩子,大于根的走右孩子。

優勢

? 查詢時走索引比全表掃描可以大大降低IO,提高查詢速度

? 索引是已經做完排序的列,拿到的數據是已經有序,減少CPU的時候

? 如果返回的列是索引列,那么都不需要從數據塊從拿數據。

劣勢

? 增加了額外的存儲需求

? 如果表設計有問題,而且查詢條件很多,建很多索引的話,表所對應的索引甚至可能比表占用的空間還大

? 索引的存在會降低DML效率,頻繁的DML操作甚至會影響執行計劃,錯誤的執行計劃會導致SQL執行很慢

? 如果表很大,索引經常可能需要不停的優化,采集表的統計信息,基于更好更全的統計信息才能有更優的執行計劃生成

? 列有大量NULL值不建議創建索引

索引的分類

? 1.單值索引:根據一個列創建索引,然而大多數情況下都是根據查詢條件創建多值索引

? 2.唯一索引:索引列的數據是唯一的

? 3.復合索引:索引的列有多個,比如根據入學時間和學號區間查詢所有學生,那么就可以創建一個符合索引(入學時間+學號)

索引B+樹

?

假設要查詢key=29,根磁盤塊1中的17和35比,下一步應該找磁盤快3中的P2,在與該P2中的26和30比,下一步找磁盤快8,找到29這個索引項,然后拿該索引項的指針去數據區拿真實的數據行

該如何決定是否創建索引

? 1.主鍵會自動創建索引

? 2.頻繁查詢的條件需要建立復合索引

? 3.和其他表有外鍵的列,要創建索引

? 4.頻繁執行DML操作的字段不適合創建索引,原因是DML會導致索引重建

? 5.where 條件用不到的列不適合創建索引

? 6.拋開主鍵和特殊場景,一般都是創建復合索引

? 7.在設計組合索引的時候,應該考慮到查詢字段需求和排序字段需求,盡量保持復合索引字段與查詢排序條件一致,可以提高效率

? 8.查詢中統計或者分組的字段

? 9.表太小完全沒有必要創建索引,因為只需要一次IO就把整表拿了過來

? 10.重復值嚴重的列不適合創建索引,比如100W條記錄,而某一列只有3種重復的值,而且三種值絕大多數都是某一種,那么根據該列查詢時,選擇率非常低,近似于全表掃描。在生產中,主要是表的狀態字段或者性別字段等等

? 有這么多限制,可能創建出來的索引可能會很多,特別是字段特別多的表,這種情況最好和DBA一起協商

轉載于:https://my.oschina.net/weiweiblog/blog/1829805

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

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

相關文章

Java基礎之反射機制

Java反射機制 反射機制是什么 反射機制是在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意一個方法和屬性&#xff1b;這種動態獲取的信息以及動態調用對象的方法的功能稱為ja…

C#邏輯運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 邏輯運算符用于連接一個或多個條件&#xff0c;判斷這些條件是否成立。 &#xff23;&#xff03;的邏輯運算符可以分為兩類&#xff1a; “&#xff06;” “&#xff5c;” “&…

通過ProGet搭建一個內部的Nuget服務器

.NET Core項目完全使用Nuget 管理組件之間的依賴關系&#xff0c;Nuget已經成為.NET 生態系統中不可或缺的一個組件&#xff0c;從項目角度&#xff0c;將項目中各種組件的引用統統交給NuGet&#xff0c;添加組件/刪除組件/以及更新組件即可一鍵完成&#xff0c;大大提升工作效…

unity官方教程-TANKS(一)

unity官方教程TANKS&#xff0c;難度系數中階。跟著官方教程學習Unity&#xff0c;通過本教程你可以學會使用Unity開發游戲的基本流程。 一、環境 Unity 版本 > 5.2Asset Store 里面搜索 Tanks!Tutorial ,下載導入 二、項目設置 為了便于開發&#xff0c;很多時候我們選用的…

Play框架的用戶驗證。

最近剛剛參與一個基于Play框架的管理平臺的升級工作&#xff0c;其中涉及到了用戶的驗證工作。第一次接觸play框架&#xff0c;直接看已有代碼&#xff0c;有點暈。因此&#xff0c;自己實現了一個簡單的用戶驗證功能。 首先&#xff0c;新建一個User類&#xff0c;包含兩個屬性…

C#條件運算符if-else的簡化格式

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 條件運算符&#xff08;&#xff1f;&#xff1a;&#xff09;是&#xff49;&#xff46;……&#xff45;&#xff4c;&#xff53;&#xff45;的簡化形式 其使用格式為&#xff1a…

碼率控制方式選擇

同碼率下的圖像質量或同圖像質量下的碼率。 AVCodecContext /** * the average bitrate * - encoding: Set by user; unused for constant quantizer encoding. * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the strea…

Fortran執行語句中的“雙冒號” ::

雙冒號“::”&#xff0c;通常出現于Fortran在變量聲明中&#xff0c;但是在特殊情況下&#xff0c;也會出現于數組中。例如&#xff1a; ... real,target,dimension(10):: a real,pointer,dimension(:):: pa,pb integer:: n3 ... pa > a(n::1) pb > a(n:10:1) ... 咋一看…

VS配置本地IIS以域名訪問

1.IIS下配置自己的網站&#xff0c;添加主機名 2.修改hosts文件&#xff08;C://Windows/System32/drivers/etc&#xff09; 3.VS中配置項目Web服務器&#xff08;選擇外部主機&#xff09; 轉載于:https://www.cnblogs.com/zuimeideshi520/p/7028544.html

try、catch、finally 和 throw-C#異常處理

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 異常是在程序執行期間出現的問題。C# 中的異常是對程序運行時出現的特殊情況的一種響應&#xff0c;比如嘗試除以零。 異常提供了一種把程序控制權從某個部分轉移到另一個部分的方式。…

Spark RDD/Core 編程 API入門系列 之rdd實戰(rdd基本操作實戰及transformation和action流程圖)(源碼)(三)...

本博文的主要內容是&#xff1a; 1、rdd基本操作實戰 2、transformation和action流程圖 3、典型的transformation和action RDD有3種操作&#xff1a; 1、 Trandformation 對數據狀態的轉換&#xff0c;即所謂算子的轉換 2、 Action 觸發作業&#xff0c;即所謂得結果…

用GDB調試程序

GDB概述GDB 是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許&#xff0c;各位比較喜歡那種圖形界面方式的&#xff0c;像VC、BCB等IDE的調試&#xff0c;但如果你是在 UNIX平臺下做軟件&#xff0c;你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所…

燈塔的出現給那些有想法,有能力而又缺乏資金的社區人士提供了一條途徑

2019獨角獸企業重金招聘Python工程師標準>>> 在上個月&#xff0c;BCH社區傳出基于比特幣現金的眾籌平臺Lighthouse&#xff08;燈塔&#xff09;正在復活的消息&#xff0c;并且有網友在論壇上貼出了部分網站圖片。當消息被證實為真&#xff0c;官網和項目的審核細…

PID 算法理解

PID 算法 使用環境&#xff1a;受到外界的影響不能按照理想狀態發展。如小車的速度不穩定的調節&#xff0c;盡快達到目標速度。 條件&#xff1a;閉環系統->有反饋 要求&#xff1a;快準狠 分類&#xff1a;位置式、增量式 增量式 輸入&#xff1a;前次速度、前前次速度、前…

C#字符串的基本操作

文章目錄簡介字符串判斷是否相等語法實例字符串比較大小語法實例判斷字符串變量是否包含指定字符或字符串語法實例查找字符串變量中指定字符或字符串出現的位置語法實例取子串語法實例插入子串語法實例刪除子串語法實例替換子串語法實例去除字符串空格語法實例博主寫作不容易&a…

C++利用SOCKET傳送文件

C利用SOCKET傳送文件 /*server.h*/ #pragma comment(lib, "WS2_32") #include <WinSock2.h> #include <iostream> //#include <stdio.h> #include <assert.h> #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 …

三種方式在CentOS 7搭建KVM虛擬化平臺

KVM 全稱是基于內核的虛擬機&#xff08;Kernel-based Virtual Machine&#xff09;&#xff0c;它是一個 Linux的一個內核模塊&#xff0c;該內核模塊使得 Linux變成了一個Hypervisor&#xff1a;它由 Quramnet開發&#xff0c;該公司于 2008年被 Red Hat 收購 KVM的整體結構&…

(五)EasyUI使用——datagrid數據表格

DataGrid以表格形式展示數據&#xff0c;并提供了豐富的選擇、排序、分組和編輯數據的功能支持。DataGrid的設計用于縮短開發時間&#xff0c;并且使開發人員不需要具備特定的知識。它是輕量級的且功能豐富。單元格合并、多列標題、凍結列和頁腳只是其中的一小部分功能。具體功…

拾取模型的原理及其在THREE.JS中的代碼實現

1. Three.js中的拾取 1.1. 從模型轉到屏幕上的過程說開 由于圖形顯示的基本單位是三角形&#xff0c;那就先從一個三角形從世界坐標轉到屏幕坐標說起&#xff0c;例如三角形abc 乘以模型視圖矩陣就進入了視點坐標系&#xff0c;其實就是相機所在的坐標系&#xff0c;如下圖&am…