DDL執行
線上服務器執行DDL,更新表結構,需要謹慎,結構更改會導致全表被獨占鎖定(新版本有改善)
避免這種情況,使用COPY策略,而不是直接執行ALTER TABLE陳述句
思路:創建一個新表,滿足新要求,將舊表資料逐潭訓入新表,同時表上可以執行其他任務,匯入的程序其他任務都記錄在日志,匯入完成后根據日志更新新表,最后新表替換舊表(Java等代碼中實作)
資料匯入陳述句
在恢復資料時,需要大量的資料匯入
思路:匯入時,先禁用索引和約束;匯入完畢后,再開啟索引和約束,一次性創建索引
有可能使用到的陳述句:禁用索引和開啟索引
ALTER TABLE [table-name] DISABLE KEYS; ALTER TABLE [table-name] ENABLE KEYS;
對于InnoDB存盤引擎,可以將多條SQL放入一個事務中完成
可以使用prepare預編譯的方案執行匯入操作,減少相同結構的SQL編譯次數
大容量頁碼LIMIT
盡量不要使用大的OFFSET,比如LIMIT 10000,10
思路:盡量使用條件過濾,完成資料篩選,而不是通過OFFSET跳過已經查詢到的資料
SELECT *
不要使用SELECT *,而是使用具體的欄位;這一點對性能影響不是很大,不過這是規范
ORDER BY RAND()不要用
這句話是隨機排序,如果業務要隨機選擇盡量在服務器代碼中實作,隨機生成主鍵進行檢索
單表和多表查詢
盡量使用單表查詢來代替多表查詢,原因有以下幾點:
(1)單表計算的壓力在java代碼,多表計算的壓力在資料庫
(2)多表查詢會一個一個表依次執行,最后再合并結果
(3)多表查詢會增加鎖定時間,降低程式并發性能
COUNT(*)
MYISAM會自動存盤COUNT(*)的值,INNODB沒有內部計數器,執行這句話相對來說較慢
解決思路:額外創建一張表,把COUNT(*)的值記錄下來
另外:
COUNT(ID)表示的是:統計ID欄位不為NULL的數量
COUNT(1)表示的是:統計記錄數量,和COUNT(*)幾乎一樣
LIMIT 1
如果你確定查到的結果只有一個,那么加入LIMIT 1會提高性能
慢查詢日志
用于記錄執行時間超過某個臨界值的SQL的日志,用戶快速定位慢查詢
開啟該日志:
查詢是否開啟
SHOW VARIABLES LIKE 'slow_query_log';
開啟
SET GLOBAL slow_query_log=On;
開啟后會在資料目錄創建slow.log檔案
查看臨界時間,默認是十秒,很長
SHOW VARIABLES LIKE 'long_query_time';
設定臨界時間
SET long_query_time = 0.5;
一旦超過了0.5秒,就會被自動記錄
PROFILE資訊統計
詳細記錄SQL陳述句執行時間的工具
開啟PROFILE:
SET profiling=On;
使用命令查看結果
SHOW PROFILES;
具體某條的詳情
SHOW PROFILE FOR QUERY [query_id]
典型的服務器配置
(1)MAX_CONNECTIONS:當前MySQL允許最大連接數151個
(2)table_open_cache:表句柄快取2000
(3)KEY_BUFFER_SIZE:索引緩沖大小8388608
(4)innodb_buffer_pool_size:INNODB存盤引擎快取池大小,比較重要,盡可能地設定更大
(5)innodb_file_per_table:INNODB表的獨立表檔案,ON就表示一個表對應一個表檔案,否則所有INNODB表檔案存到一起
以上的配置全部取決于實際的運行環境
mysqlslap壓力測驗工具
這是一個mysql自帶的工具,是一個EXE,直接運行即可,具體的百度,這是DBA的作業,不是程式員的作業
最后,推薦一篇文章,寫的很不錯
https://www.cnblogs.com/jajian/p/9758192.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/70547.html
標籤:MySQL
下一篇:MySQL 事務的隔離級別
