MySQL之mysqlcheckcheck、optimize和analyze html
㈠ optimize
optimize能夠回收空間、減小碎片、提升I/O
目前支持的存儲引擎有:InnoDB、MyASIM和ARCHIVE
若是是Replication環境、可加NO_WRITE_TO_BINLOG(或者LOCAL、意思徹底相同)、好比:
optimize local table table_name;
mysql
如下是一個簡單測試: 面試
[plain] view plain copy redis
㈡ check
檢查表或視圖的有無錯誤
支持表引擎有:InnoDB和MyISAM
下面簡單模擬一個測試: sql
[plain] view plain copy shell
㈢ analyze
用於收集優化器統計信息、和tuning相關、
這個命令對 MyISAM、BDB、InnoDB 存儲引擎的表有做用
若是不想記錄到binlog、也可加關鍵字local或者另一個 數據庫
[plain] view plain copy vim
分析表主要做用是分析關鍵字的分佈。檢查表主要做用是檢查表是否存在錯誤。優化表主要做用是消除刪除或者更新形成的空間浪費。本小節將爲讀者介紹分析表、檢查表和優化表的方法。
1.分析表
MySQL中使用ANALYZE TABLE語句來分析表,該語句的基本語法以下:
ANALYZE TABLE 表名1 [,表名2…] ;
使用ANALYZE TABLE分析表的過程當中, 數據庫 系統 會對錶加一個只讀鎖。在分析期間,只能讀取表中的記錄,不能更新和插入記錄。ANALYZE TABLE語句可以分析InnoDB和MyISAM類型的表。
【示例18-8】 下面使用ANALYZE TABLE語句分析score表,分析結果以下:
mysql > ANALYZE TABLE score;
+-------------+-----------+--------------+---------------+
| Table | Op | Msg_type | Msg_text |
+-------------+-----------+--------------+---------------+
| test.score | analyze | status | OK |
+-------------+-----------+--------------+---------------+
1 row in set (0.05 sec)
上面結果顯示了4列信息,詳細介紹以下:
Table:表示表的名稱;
Op:表示執行的操做。analyze表示進行分析操做。check表示進行檢查查找。optimize表示進行優化操做;
Msg_type:表示信息類型,其顯示的值一般是狀態、警告、錯誤和信息這四者之一;
Msg_text:顯示信息。
檢查表和優化表以後也會出現這4列信息。
2.檢查表
MySQL中使用CHECK TABLE語句來檢查表。CHECK TABLE語句可以檢查InnoDB和MyISAM類型的表是否存在錯誤。並且,該語句還能夠檢查視圖是否存在錯誤。該語句的基本語法以下:
CHECK TABLE 表名1 [,表名2…] [option] ;
其中,option參數有5個參數,分別是QUICK、FAST、CHANGED、MEDIUM和EXTENDED。這5個參數的執行效率依次下降。option選項只對MyISAM類型的表有效,對InnoDB類型的表無效。CHECK TABLE語句在執行過程當中也會給表加上只讀鎖。
3.優化表
MySQL中使用OPTIMIZE TABLE語句來優化表。該語句對InnoDB和MyISAM類型的表都有效。可是,OPTILMIZE TABLE語句只能優化表中的VARCHAR、BLOB或TEXT類型的字段。OPTILMIZE TABLE語句的基本語法以下:
OPTIMIZE TABLE 表名1 [,表名2…] ;
經過OPTIMIZE TABLE語句能夠消除刪除和更新形成的磁盤碎片,從而減小空間的浪費。OPTIMIZE TABLE語句在執行過程當中也會給表加上只讀鎖。
說明:若是一個表使用了TEXT或者BLOB這樣的數據類型,那麼更新、刪除等操做就會形成磁盤空間的浪費。由於,更新和刪除操做後,之前分配的磁盤空間不會自動收回。使用OPTIMIZE TABLE語句就能夠將這些磁盤碎片整理出來,以便之後再利用。
服務器
按期分析表 微信
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]
本語句用於分析和存儲表的關鍵字分佈。在分析期間,使用一個讀取鎖定對錶進行鎖定。這對於MyISAM, BDB和InnoDB表有做用。對於MyISAM表,本語句與使用myisamchk -a至關。
MySQL使用已存儲的關鍵字分佈來決定,當您對除常數之外的對象執行聯合時,表按什麼順序進行聯合。
mysql> analyze table a;
+--------+---------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+---------+----------+-----------------------------+
| test.a | analyze | status | Table is already up to date |
+--------+---------+----------+-----------------------------+
1 row in set (0.00 sec)
按期檢查表
CHECK TABLE tbl_name [, tbl_name] [option]
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
檢查一個或多個表是否有錯誤。CHECK TABLE對MyISAM和InnoDB表有做用。對於MyISAM表,關鍵字統計數據被更新。
mysql> check table a;
+--------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+-------+----------+----------+
| test.a | check | status | OK |
+--------+-------+----------+----------+
1 row in set (0.00 sec)
CHECK TABLE也能夠檢查視圖是否有錯誤,好比在視圖定義中被引用的表已不存在。
咱們爲上面的表a建立一個視圖
mysql> create view a_view as select * from a;
Query OK, 0 rows affected (0.02 sec)
而後CHECK一下該視圖,發現沒有問題
mysql> check table a_view;
+-------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------+-------+----------+----------+
| test.a_view | check | status | OK |
+-------------+-------+----------+----------+
1 row in set (0.00 sec)
如今刪掉視圖依賴的表
mysql> drop table a;
Query OK, 0 rows affected (0.01 sec)
再CHECK一下剛纔的視圖,發現報錯了
mysql> check table a_view\G;
*************************** 1. row ***************************
Table: test.a_view
Op: check
Msg_type: Error
Msg_text: Table 'test.a' doesn't exist
*************************** 2. row ***************************
Table: test.a_view
Op: check
Msg_type: Error
Msg_text: View 'test.a_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
*************************** 3. row ***************************
Table: test.a_view
Op: check
Msg_type: error
Msg_text: Corrupt
3 rows in set (0.00 sec)
ERROR:
No query specified
按期優化表
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]
若是您已經刪除了表的一大部分,或者若是您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了不少更改,則應使用OPTIMIZE TABLE。被刪除的記錄被保持在連接清單中,後續的INSERT操做會從新使用舊的記錄位置。您可使用OPTIMIZE TABLE來從新利用未使用的空間,並整理數據文件的碎片。
在多數的設置中,您根本不須要運行OPTIMIZE TABLE。即便您對可變長度的行進行了大量的更新,您也不須要常常運行,每週一次或每個月一次便可,只對特定的表運行。
OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起做用。
對於MyISAM表,OPTIMIZE TABLE按以下方式操做:
若是表已經刪除或分解了行,則修復表。
若是未對索引頁進行分類,則進行分類。
若是表的統計數據沒有更新(而且經過對索引進行分類不能實現修復),則進行更新。
mysql> OPTIMIZE table a;
+--------+----------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+----------+----------+-----------------------------+
| test.a | optimize | status | Table is already up to date |
+--------+----------+----------+-----------------------------+
1 row in set (0.00 sec)
****
須要注意的是不管是ANALYZE,CHECK仍是OPTIMIZE在執行期間將對錶進行鎖定,所以請注意這些操做要在 數據庫 不繁忙的時候執行
****
2012-11-22 13:04 by 軒脈刃, 1318 閱讀, 5 評論, 收藏, 編輯
mysql官方文檔在
http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
這裏的rows行是表的行數,可是其實是不許的。myisam是準的,其餘的存儲引擎是不許的。要準確的行數就須要使用count(*) 來獲取了。
執行大批量刪除的時候注意要使用上limit
由於若是不用limit,刪除大量數據頗有可能形成死鎖
若是delete的where語句不在索引上,能夠先找主鍵,而後根據主鍵刪除數據庫
ps: 平時update和delete的時候最好也加上limit 1 來防止誤操做
l optimize 數據在插入,更新,刪除的時候不免一些數據遷移,分頁,以後就出現一些碎片,長此以往碎片積累起來影響性能,這就須要DBA按期的優化數據庫減小碎片,這就經過optimize命令。
如對MyisAM表操做:optimize table 表名
對於InnoDB表是不支持optimize操做,不然提示「Table does not support optimize, doing recreate + analyze instead」,固然也能夠經過命令:alter table one type=innodb; 來替代。
l Analyze 用來分析和存儲表的關鍵字的分佈,使得系統得到準確的統計信息,影響 SQL 的執行計劃的生成。對於數據基本沒有發生變化的表,是不須要常常進行表分析的。可是若是表的數據量變化很明顯,用戶感受實際的執行計劃和預期的執行計劃不 同的時候,執行一次表分析可能有助於產生預期的執行計劃。
Analyze table 表名
l Check檢查表或者視圖是否存在錯誤,對 MyISAM 和 InnoDB 存儲引擎的表有做用。對於 MyISAM 存儲引擎的表進行表檢查,也會同時更新關鍵字統計數據
l Repair optimize須要有足夠的硬盤空間,不然可能會破壞表,致使不能操做,那就要用上repair,注意INNODB不支持repair操做
方法:
使用預設表
好比id和toid的映射
其中id是固定的,toid是隨機的。
而後在redis或memcache中記錄一個指針值,指向id
當要獲取一個新toid的時候,取出指針值,加1,而後去預設表中獲取toid
查詢的時候必需要考慮到如何命中索引
好比有幾個小招:
1 不要在索引列中使用表達式
where mycol *2 < 4
2 不要在like模式的開始位置使用通配符%
where col_name like ‘%string%’
不如
where col_name like ‘string%’
3 避免過多使用mysql自動轉換類型,有可能沒法用到index
好比
select * from mytbl where str_col=4
可是str_col爲字符串,這裏其實就隱含了字符串變化
應該使用
select * from mytbl where str_col=’4’
否
索引是按照順序排列的。因此即便索引比表大,也是能夠加快查詢速度的。
固然若是索引比表還大首要的任務必須是檢查下索引創建地是否有問題
char是定長,varchar變長
varchar除了設置了數據以外,還多使用1兩個字節定義了數據實際長度。
char會在後面空餘的行填充上空字符串
myisam建議使用char。myisam中有個靜態表的概念。使用char比使用varchar的查詢效率高不少。
innodb建議使用varchar。主要是從節省空間的方面考慮
一個表中至多隻能有一個字段設置CURRENT_TIMESTAMP
對於下面的需求:
一個表中,有兩個字段,createtime和updatetime。
1 當insert的時候,sql兩個字段都不設置,會設置爲當前的時間
2 當update的時候,sql中兩個字段都不設置,updatetime會變動爲當前的時間
這樣的需求是作不到的。由於你沒法避免在兩個字段上設置CURRENT_TIMESTAMP
解決辦法有幾個:
1 使用觸發器。
2 將第一個timestamp的default設置爲0
3 老老實實在sql語句中使用時間戳。
http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html
不要使用select count(*)
使用show table status like ‘table_name’ 可是innodb的話會有50%左右的浮動,是個預估值
1 不要設置爲int,請設置爲unsinged int,auto_increment的範圍是根據類型來斷定的
2 auto_increment數據列必需要有索引,而且保證惟一性。
3 auto_increment必須有NOT NULL屬性
4 auto_increment可使用
UPDATE table SET seq = LAST_INSERT_ID(seq -1)
表示時間可使用timestamp和datetime來使用
datetime表示的時間能夠從0000-00-00:00:00 到9999-12-31:00:00:00
timestamp表示的時間爲1970-01-01 08:00:01到2038-01-19 11:14:07
timestamp佔用的空間比datetime少,且能夠設置時區等功能,因此能使用timestamp的地方儘可能使用timestamp
使用timestamp還能夠設置
[ON UPDATE CURRENT_TIMESTAMP]
[DEFAULT CURRENT_TIMESTAMP]
myisam不支持外鍵,innodb支持;
若是你使用建立外鍵的命令對myisam的表操做,操做不會返回失敗,可是是沒有外鍵關聯創建起來的。
常常有需求對一個字段加減會使用
update table set a = a+1
這樣是對的
可是若是這樣設置:
select a from table
取出數據後a爲1
update table set a =2
這樣會致使若是在select和update之間有其餘事務操做修改這個字段的話,致使最後的設置可能出錯。
mysqlcheck使用介紹 檢查、修復、優化、分析表
官網: https://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html
一般使用該工具通常語法爲:
好比對mysql庫進行mysqlcheck操做:
實際上該工具是爲了方便用戶使用,而使用了CHECK TABLE、REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE語句。
--analyze選項:其實是執行了ANALYZE TABLE(支持InnoDB,MyISAM,NDB)
--check選項:其實是執行了CHECK TABLE(支持InnoDB,MyISAM,ARCHIVE,CSV)
--optimize選項:實際上執行了OPTIMIZE TABLE(支持InnoDB,MyISAM,ARCHIVE)
--repair選項:實際上執行REPAIR TABLE(支持MyISAM,ARCHIVE,CSV)
通常狀況不須要加這些選項,除非須要修復
其餘修改選項:
--repair --quick 嘗試快速修復
--repair 正常修復(除非快速修復失敗)
--repair --force 強行修復
固然,在mysqlcheck時,每張表會被加上READ LOCK。
跑 該進程時,尤爲是大表,將會變得十分耗時。
且該工具必須在mysqld服務運行的狀況下使用。
此外,部分存儲引擎的表是不被支持的:
我創了四張表,其存儲引擎分別爲ARCHIVE、BLACKHOLE、MEMORY、MRG_MYISAM
而後check了一下,發現blackhole和memory是不被支持的,由於這兩個存儲引擎只存儲.frm的表定義在磁盤上。
其餘選項參考:
Format | Description | Introduced |
---|---|---|
--all-databases | Check all tables in all databases | |
--all-in-1 | Execute a single statement for each database that names all the tables from that database | |
--analyze | Analyze the tables | |
--auto-repair | If a checked table is corrupted, automatically fix it | |
--bind-address=ip_address | Use specified network interface to connect to MySQL Server | |
--character-sets-dir=path | Directory where character sets are installed | |
--check | Check the tables for errors | |
--check-only-changed | Check only tables that have changed since the last check | |
--check-upgrade | Invoke CHECK TABLE with the FOR UPGRADE option | |
--compress | Compress all information sent between client and server | |
--databases | Process all tables in the named databases | |
--debug[=debug_options] | Write a debugging log | |
--debug-check | Print debugging information when program exits | |
--debug-info | Print debugging information, memory, and CPU statistics when program exits | |
--default-auth=plugin | Authentication plugin to use | 5.6.2 |
--default-character-set=charset_name | Specify default character set | |
--defaults-extra-file=file_name | Read option file in addition to usual option files | |
--defaults-file=file_name | Read only named option file | |
--defaults-group-suffix=str | Option group suffix value | |
--extended | Check and repair tables | |
--fast | Check only tables that have not been closed properly | |
--fix-db-names | Convert database names to 5.1 format | |
--fix-table-names | Convert table names to 5.1 format | |
--force | Continue even if an SQL error occurs | |
--help | Display help message and exit | |
--host=host_name | Connect to MySQL server on given host | |
--login-path=name | Read login path options from .mylogin.cnf | 5.6.6 |
--medium-check | Do a check that is faster than an --extended operation | |
--no-defaults | Read no option files | |
--optimize | Optimize the tables | |
--password[=password] | Password to use when connecting to server | |
--pipe | On Windows, connect to server using named pipe | |
--plugin-dir=path | Directory where plugins are installed | 5.6.2 |
--port=port_num | TCP/IP port number to use for connection | |
--print-defaults | Print defaults | |
--protocol=type | Connection protocol to use | |
--quick | The fastest method of checking | |
--repair | Perform a repair that can fix almost anything except unique keys that are not unique | |
--secure-auth | Do not send passwords to the server in old (pre-4.1.1) format | 5.6.17 |
--shared-memory-base-name=name | The name of shared memory to use for shared-memory connections | |
--silent | Silent mode | |
--skip-database=db_name | Omit this database from performed operations | 5.6.11 |
--socket=path | For connections to localhost, the Unix socket file to use | |
--ssl | Enable SSL for connection | |
--ssl-ca=file_name | Path of file that contains list of trusted SSL CAs | |
--ssl-capath=dir_name | Path of directory that contains trusted SSL CA certificates in PEM format | |
--ssl-cert=file_name | Path of file that contains X509 certificate in PEM format | |
--ssl-cipher=cipher_list | List of permitted ciphers to use for SSL encryption | |
--ssl-crl=file_name | Path of file that contains certificate revocation lists | 5.6.3 |
--ssl-crlpath=dir_name | Path of directory that contains certificate revocation list files | 5.6.3 |
--ssl-key=file_name | Path of file that contains X509 key in PEM format | |
--ssl-verify-server-cert | Verify server Common Name value in its certificate against host name used when connecting to server | |
--tables | Overrides the --databases or -B option | |
--use-frm | For repair operations on MyISAM tables | |
--user=user_name, | MySQL user name to use when connecting to server | |
--verbose | Verbose mode | |
--version | Display version information and exit | |
--write-binlog | Log ANALYZE, OPTIMIZE, REPAIR statements to binary log. --skip-write-binlog adds NO_WRITE_TO_BINLOG to these statements. |
MySQL數據庫mysqlcheck的使用方法的相關知識是本文咱們主要要介紹的內容,咱們知道,mysqlcheck,是mysql自帶的能夠檢查和修復MyISAM表,而且它還能夠優化和分析表,mysqlcheck的功能相似myisamchk,但其工做不一樣。
主要差異是當mysqld服務器在運行時必須使用mysqlcheck,而myisamchk應用於服務器沒有運行時。使用mysqlcheck的好處是不須要中止服務器來檢查或修復表。使用myisamchk修復失敗是不可逆的。
1.若是須要檢查並修復全部的數據庫的數據表,那麼可使用:
# mysqlcheck -A -o -r -p
# Enter password:
database1 OK
database2 OK
2.若是須要修復指定的數據庫用
# mysqlcheck -A -o -r Database_NAME -p
3.若是使用其餘用戶名修復
# mysqlcheck -A -o -r -p -u admin
這裏admin是指定的mysql用戶賬號。
4.若是使用指定的mysql.sock進入數據庫並修復
# mysqlcheck -A -o -r -p -S /tmp/mysql.sock
這裏/tmp/mysql.sock是指定的mysql.sock存放的路徑。
About Me
.............................................................................................................................................
● 本文做者:小麥苗,部份內容整理自網絡,如有侵權請聯繫小麥苗刪除
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客園(http://www.cnblogs.com/lhrbest)和我的微信公衆號(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客園地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、我的簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 數據庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ羣號:230161599(滿)、618766405
● 微信羣:可加我微信,我拉你們進羣,非誠勿擾
● 聯繫我請加QQ好友(646634621),註明添加原因
● 於 2017-09-01 09:00 ~ 2017-09-30 22:00 在魔都完成
● 文章內容來源於小麥苗的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解
● 版權全部,歡迎分享本文,轉載請保留出處
.............................................................................................................................................
● 小麥苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麥苗出版的數據庫類叢書:http://blog.itpub.net/26736162/viewspace-2142121/
.............................................................................................................................................
使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公衆號(xiaomaimiaolhr)及QQ羣(DBA寶典),學習最實用的數據庫技術。
小麥苗的微信公衆號 小麥苗的DBA寶典QQ羣1 小麥苗的DBA寶典QQ羣2 小麥苗的微店
.............................................................................................................................................
來自 「 ITPUB博客 」 ,連接:http://blog.itpub.net/26736162/viewspace-2144629/,如需轉載,請註明出處,不然將追究法律責任。