MySQL數據庫優化(1)

前言

無論對於哪一種服務,對於其優化,無非是從兩個方面着手,第一個是對於硬件方面的優化,第二個是對系統以及服務自己的優化。mysql

一、查詢鏈接MySQL服務器的次數

mysql> show status like 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections   | 3     |
+---------------+-------+
1 row in set (0.01 sec)

二、查詢MySQL服務器的運行時間

mysql> show status like 'uptime';      //單位爲「秒」
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 127   |
+---------------+-------+
1 row in set (0.00 sec)

三、查詢操做的次數

mysql> show status like 'com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 12    |
+---------------+-------+
1 row in set (0.00 sec)

四、插入操做的次數

mysql> show status like 'com_insert';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_insert    | 1     |
+---------------+-------+
1 row in set (0.00 sec)

五、更新操做的次數

mysql> show status like 'com_update';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_update    | 1     |
+---------------+-------+
1 row in set (0.00 sec)

六、刪除操做的次數

mysql> show status like 'com_delete';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_delete    | 0     |
+---------------+-------+
1 row in set (0.00 sec)

七、查詢MySQL服務器的慢查詢次數

mysql> show status like 'slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 21    |
+---------------+-------+
1 row in set (0.00 sec)

2、對SQL語句進行分析

一、使用explain關鍵字進行分析

mysql> explain select * from stu_info\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE 
        table: stu_info         #表名
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL     #使用哪一個列或常數與索引一塊兒使用來查詢記錄
         rows: 3
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

上面的select_type解釋以下:sql

  • Select_type:表示select語句的類型 其中simple 是簡單查詢(不包括鏈接查詢和子查詢) Primary 主查詢 Union 鏈接查詢;

二、利用索引來提升查詢效率

mysql> explain select * from stu_info where s_id=3\G     #沒有索引時的查詢結果分析以下
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: stu_info
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3        #須要查詢三行才能查到(這個表數據總共也就三行)
     filtered: 33.33
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

mysql> create index index_01 on stu_info(s_id);     #建立索引
mysql> explain select * from stu_info where s_id=3\G   #再次進行查詢
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: stu_info
   partitions: NULL
         type: ref
possible_keys: index_01   #使用的是哪一個索引名稱
          key: index_01
      key_len: 5
          ref: const
         rows: 1     #建立索引後,查詢1行就查到可。
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

使用索引注意事項以下:數據庫

  • 作索引了以後,用 like ‘xx%’ %不在第一位查詢效率最高;
  • 若使用多字段索引,除了第一字段查詢最快,其他不會按索引來,索引不生效;
  • 若建立索引所設置的字段,查詢索引組合 or 左右邊的值都是屬於索引設置字段下的值。

關於使用索引的其餘注意事項,能夠參考博文:MySQL索引類型詳解服務器

3、profiling分析查詢

經過慢日誌查詢能夠知道哪些SQL語句執行效率低下,經過explain咱們能夠得知SQL語句的具體執行狀況,索引使用等,還能夠結合show命令查看執行狀態。若是以爲explain的信息不夠詳細,能夠同經過profiling命令獲得更準確的SQL執行消耗系統資源的信息。 profiling默認是關閉的。能夠經過如下語句查看:ide

一、查看profiling是否開啓

mysql> show variables like '%profiling%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| have_profiling         | YES   |
| profiling              | OFF   |            #OFF表示未開啓
| profiling_history_size | 15    |
+------------------------+-------+
3 rows in set (0.00 sec)

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |                   # 0表示未開啓
+-------------+
1 row in set, 1 warning (0.00 sec)

二、開啓profiling

mysql> set profiling=1;          #開啓
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@profiling;    #qu
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)

三、執行要測試的SQL語句

mysql> select * from bank;
+-------+-------+
| name  | money |
+-------+-------+
| lu    |  1000 |
| qi    |  1000 |
| zhang |  2000 |
+-------+-------+
3 rows in set (0.00 sec)

四、查看SQL語句對應的ID,對其進行分析

mysql> show profiles;
+----------+------------+--------------------+
| Query_ID | Duration   | Query              |
+----------+------------+--------------------+
|        1 | 0.00012925 | select @@profiling |
|        2 | 0.00401325 | SELECT DATABASE()  |
|        3 | 0.01405400 | show databases     |
|        4 | 0.00034675 | show tables        |
|        5 | 0.00011475 | show tabels        |
|        6 | 0.00029225 | show tables        |
|        7 | 0.00041200 | select * from bank |
|        8 | 0.00020225 | select * from bank |
+----------+------------+--------------------+
8 rows in set, 1 warning (0.00 sec)
mysql> show profile for query 7;     #查詢sql語句的詳細分析
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000161 |
| checking permissions | 0.000010 |
| Opening tables       | 0.000016 |
| init                 | 0.000047 |
| System lock          | 0.000013 |
| optimizing           | 0.000004 |
| statistics           | 0.000013 |
| preparing            | 0.000009 |
| executing            | 0.000004 |
| Sending data         | 0.000050 |
| end                  | 0.000004 |
| query end            | 0.000008 |
| closing tables       | 0.000007 |
| freeing items        | 0.000012 |
| logging slow query   | 0.000041 |
| cleaning up          | 0.000013 |
+----------------------+----------+
16 rows in set, 1 warning (0.00 sec)

在上面命令的返回結果中,status是profile裏的狀態,duration是status狀態下的耗時,所以咱們關注的就是哪一個狀態最耗時,這些狀態中哪些能夠優化,固然也能夠查看更多的信息,好比:CPU等。語法以下:測試

mysql> show profile block io for query 7\G
mysql> show profile all for query 7\G

除了上面的block io和all之外,還能夠換成cpu(顯示用戶cpu時間、系統cpu時間)、ipc(顯示發送和接收相關開銷信息)、page faults(顯示頁面錯誤相關開銷信息)、swaps(顯示交換次數相關開銷的信息)。優化

注意:測試完成以後,記得要關閉調試功能,以避免影響數據庫的正常使用。ui

4、對數據庫表結構進行優化

對數據庫表結構的優化大概能夠從如下幾個方面着手:調試

  • 將字段不少的表分解成多個表,儘可能避免表字段過多;
  • 增長中間表,合理增長冗餘字段;
  • 優化插入記錄的速度;
    • 在插入數據以前禁用索引,會讓建立索引不生效,命令: ALTER TABLE table_name DISABLE KEYS;
    • 根據實際狀況來定,在插入記錄以前禁用惟一性檢查,命令:set unique_checks=0;
    • 多條插入數據的命令最好整合爲一條;
    • 使用load data infle批量插入數據。
  • 對於innodb引擎的表來講,如下幾點能夠進行優化:
    • 禁用惟一性檢查:set unique_checks=0;
    • 禁用外鍵檢查:set foreign_key_checks=0;
    • 禁用自動提交:set autocommit=0;

分析表,檢查表和優化表

所謂分析表,就是分析關鍵字的分佈,檢查表就是檢查是否存在錯誤,優化表就是刪除或更新形成的空間浪費。日誌

一、分析表

分析表能夠一次分析一個或多個表,在分析期間只能讀,不能進行插入和更新操做。分析表的語法以下:

mysql> analyze table bank;
+-------------+---------+----------+----------+
| Table       | Op      | Msg_type | Msg_text |
+-------------+---------+----------+----------+
| test01.bank | analyze | status   | OK       |
+-------------+---------+----------+----------+
1 row in set (0.00 sec)

對於上述返回的結果解釋:Table是表名 ,op執行的操做是什麼, msg_type 信息級別(status是正常狀態,info是信息,note注意,warning警告,error錯誤), msg_text 是顯示信息。

二、檢查表

檢查是否存在錯誤,關鍵字統計,檢查視圖是否有錯誤 Check table 表名 option ={quick |fast | medium|extended |changed} Quick 不掃描行,不檢查錯誤鏈接 Fast 只檢查沒有被正確關閉的表 Medium 掃描行驗證被刪除的鏈接是有效的,也能夠計算各行的關鍵字校驗和。 Extended 對每行全部關鍵字進行全面的關鍵字查找,Changed 只檢查上次檢查後被更改的表和沒有被正確關閉的表,Option只對myisam 有效 對innodb表無效,在執行時會給表加上只讀鎖。

mysql> check table bank;
+-------------+-------+----------+----------+
| Table       | Op    | Msg_type | Msg_text |
+-------------+-------+----------+----------+
| test01.bank | check | status   | OK       |
+-------------+-------+----------+----------+
1 row in set (0.00 sec)

三、優化表

消除刪除或更新形成的空間浪費,命令語法格式爲:Optimize [local |no_write_to_binlog] table tb1_name …., 優化myisam的表和innodb的表都有效, 可是隻能優化表中的varchar\text\blob數字類型, 執行過程當中上只讀鎖。

mysql> optimize table bank\G
*************************** 1. row ***************************
   Table: test01.bank
      Op: optimize
Msg_type: note
Msg_text: Table does not support optimize, doing recreate + analyze instead
*************************** 2. row ***************************
   Table: test01.bank
      Op: optimize
Msg_type: status
Msg_text: OK
2 rows in set (0.04 sec)

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索