1. 程式人生 > >MySql數據庫優化可以從哪幾個方面進行?

MySql數據庫優化可以從哪幾個方面進行?

ini 獲取 oca order by 內部 span 所有 p s fonts

http://blog.csdn.net/q602075961/article/details/71076390

1、數據庫優化可以從以下幾個方面進行:

技術分享圖片

2、項目中,優化mysql之前,首先要開啟慢查詢日誌,在分析慢查詢日誌.

1,查看所有日誌狀態: show variables like ‘%quer%‘;
2,查看慢查詢狀態:show variables like ‘show%‘

linux啟用MySQL慢查詢

代碼如下

vim /etc/my.cnf
[mysqld]
slow-query-log = on # 開啟慢查詢功能
slow_query_log_file = /usr/local/mysql/data/slow-query.log # 慢查詢日誌存放路徑與名稱
long_query_time = 5 # 查詢時間超過5s的查詢語句
log-queries-not-using-indexes = on # 列出沒有使用索引的查詢語句

Windows下開啟MySQL慢查詢

MySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上

補充:

在my.cnf或者my.ini中添加log-queries-not-using-indexes參數,表示記錄下沒有使用索引的查詢。比如:

代碼如下
log-slow-queries=/data/mysqldata/slowquery.log # 慢查詢日誌存放路徑與名稱
long_query_time=5 # 查詢時間超過5s的查詢語句
log-queries-not-using-indexes # 列出沒有使用索引的查詢語句

技術分享圖片 3、如何分析sql查詢 explain返回各列的含義 extra列需要註意的返回值 Using filesort:看到這個的時候,查詢就需要優化了。MYSQL需要進行額外的步驟來發現如何對返回的行排序。它根據連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行 Using temporary看到這個的時候,查詢需要優化了。這裏,MYSQL需要創建一個臨時表來存儲結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上
3.1 MySql內部函數explain(查詢sql的執行計劃)使用方法以及返回各列的含義 explain返回各列的含義 table:顯示這一行的數據是關於哪張表的
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index 和ALL possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。 key:實際使用的索引。如果為NULL,則沒有使用索引。 keyjen:使用的索引的長度。在不損失精確性的情況下,長度越短越好 ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數 rows: MYSQL認為必須檢查的用來返回請求數據的行數
實例1:mysql函數【max()】,最後一位註冊用戶的信息 進行查詢操作,圖一是沒有加索引,圖二是加了索引的,查詢出來的type和rows字段也不相同。(參照上圖字段段含義) 圖一: 技術分享圖片 圖二: 技術分享圖片 實例2: mysql函數【count() 】,獲取註冊用戶男女人數
顯然圖三不是這個查詢方法不是咱們想要的結果,圖四和圖五也一樣,利用count()函數的特性null不統計,得到了我們想要的結果(圖六)。 圖三: 技術分享圖片
圖四: 技術分享圖片
圖五: 技術分享圖片
圖六: 技術分享圖片 3.2 子查詢的優化,通常情況下把子查詢優化為join查詢,但在優化的時候需要註意關聯建是否有一對多的關系,要特別註意重復數據 技術分享圖片 實例3:如圖七和圖八 圖七: 技術分享圖片 圖八: 技術分享圖片 3.3 GROUP BY的優化 技術分享圖片 技術分享圖片 實例4:獲取每個用戶愛好的數量。使用sql執行計劃來排查,圖九使用GROUP BY查詢,關聯的表會產生臨時表和按照文件排序,sql優化之後(圖十)就直接按照索引來查詢,避免臨時表的產生和文件形式排序。在數據量大的時候會大大減少對服務器的IO訪問。 圖九: 技術分享圖片 圖十: 技術分享圖片
3.3 LIMIT 的優化(
http://www.2cto.com/database/201306/222535.html 實例5:使用LIMIT一般都伴隨著ORDER BY(如圖十一),如果是沒有索引的字段排序的的話會按照文件排序,全表查詢會加大對服務器IO的訪問。 圖十一: 技術分享圖片
優化方案一:使用主鍵進行排序,不會造成全表掃描,會減少對服務器IO的訪問。但是還有一個問題,當所查詢的條數越往後,所掃描的條數也會越多(如圖十三) 圖十二: 技術分享圖片 圖十三: 技術分享圖片 優化方案二:可以獲取上一個主鍵的id來做一個範圍查詢來減少對服務器IO的訪問(如圖十四),但是因此還會出現另一個問題,要保證主鍵ID是連續的,當主鍵ID中間有缺少,會對我們查詢出來的數據不對。 圖十四:
技術分享圖片
優化方案三:可以添加一個字段用於LIMIT查詢,再加上索引,就和主鍵id產生同樣的效果,但是這樣會產生很多麻煩。 4 .1、如何選擇合適的列建立索引 技術分享圖片 說明: 1、如果一個索引可以包含所有字段的話,就稱之為覆蓋索引。當一張表裏的數據少的話,就可以使用覆蓋索引,這樣就可以讀取索引而不用讀取表了。 2、索引字段越小越好,因為數據庫裏的數據是已頁存儲的,如果IO一次讀取一頁的數據很多,這樣的話就可以提高服務器IO的效率。 3、在建立聯合索引的時候,一定要把離散度大的放在前面,這樣的話效果比較好
實例6:通過count函數統計唯一值,值大的離散度就大,也就是說u_pass的離散度比大u_name,所以應該使用index(u_pass,u_name) 技術分享圖片 4.2、索引的維護和優化 4.2.1重復索引 技術分享圖片 4.2.2冗余索引
技術分享圖片 4.2.3檢查重復及冗余索引的工具 技術分享圖片 4.2.4刪除不用的索引 技術分享圖片 說明:由於業務變更有些原來使用的索引現在不使用了也是需要清除的,這也是索引優化的一個方面了!
註意:再次的強調SQL和索引的優化對於數據庫的優化是相當重要的,這一層的優化如果做好了,其他的優化也能起到一些作用否則其他的優化所能起到的作用是微乎其微的,這一層的優化也是成本最低效果最好的一層了,所以對於數據庫的優化最好重點放在這一層。
5、數據庫結構優化 5.1選擇合適的數據類型 數據類型的選擇,重點在於合適二字,如何確定選擇的數據類型是否合適? 1.使用可以存下你的數據的最小的數據類型。 2.使用簡單的數據類型。Int要比varchar類型在mysql處理上簡單。 3.盡可能的使用not null定義字段。 4.盡量少用text類型,非用不可時最好考慮分表。 實例:int、bigint、smallint 和 tinyint範圍
使用整數數據的精確數字數據類型。 bigint 從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字)。存儲大小為 8 個字節。 int 從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字)。存儲大小為 4 個字節。int 的 SQL-92 同義字為 integer。 smallint 從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型數據。存儲大小為 2 個字節。 tinyint 從 0 到 255 的整型數據。存儲大小為 1 字節。 註釋 在支持整數值的地方支持 bigint 數據類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的範圍時。 在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
實例:時間使用int類型 技術分享圖片 實例:IP地址使用bigint類型 技術分享圖片 5.2 表的範式化 什麽是範式化? 技術分享圖片 不符合第三範式的要求會出現的問題 技術分享圖片 實例: 技術分享圖片 5.3 表的反範式化的使用 技術分享圖片 如我要查詢訂單商品表的下單人,電話,地址,訂單id和下單時間sql語句如下: 技術分享圖片 使用反範式化的表結構 技術分享圖片 sqi語句的查詢效率也會提升很多,數據庫表結構的設計對sql的優化也起到了很大的作用 技術分享圖片 5.4 表的垂直拆分 技術分享圖片 5.5 表的水行拆分
當表的數據比較多的時候,可以選擇將表進行水平拆分,水平拆分的本質並沒有改變表的結構僅是將原本存放在同一個表中的數據放到了多個結構一樣的表中。 水平拆分的方法: 技術分享圖片 6 系統配置優化 6.1操作系統優化 技術分享圖片 技術分享圖片 6.2 MySql配置優化 技術分享圖片 技術分享圖片 SELECT engine,ROUND(SUM(data_length+index_length)/1024/2014,1) AS "Total MB" FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in ("information_schema","performance_schema") GROUP BY ENGINE;
mysql常用配置參數1
技術分享圖片 mysql常用配置參數2
技術分享圖片 mysql常用配置參數3
技術分享圖片 mysql常用配置參數4
技術分享圖片 mysql常用配置參數5
技術分享圖片 6.3 MySql第三方配置工具 https://tools.percona.com/wizard
配置MySQL的配置文件使用工具更方便,主要就是調整配置的參數,值調整成什麽樣的參數才是合適的,估計需要補充各種基礎知識不是三言兩語說的清楚的。
就是將文本的配置方式變成了界面式的配置方式,不過經驗在此時就非常的重要了,否則壓根判斷不出什麽樣的配置才是適合的配置!
7 服務器硬件優化 技術分享圖片 技術分享圖片 模擬數據庫數據和sql語句下載: 鏈接:http://pan.baidu.com/s/1eRIkY8i 密碼:etf1

MySql數據庫優化可以從哪幾個方面進行?