登陸:mysql -uroot -p密碼
顯示與使用數(shù)據(jù)庫(kù): show databases; use 庫(kù)名;
顯示所有的數(shù)據(jù)表: show tables;
查看表結(jié)構(gòu): desc 表名;
一. 檢查數(shù)據(jù)表
檢查表: check table 表名; #可查看表是否損壞。
分析表: analyze table 表名;
修復(fù)表: repair table 表名; #修復(fù)被破壞的表
優(yōu)化表: optimize table 表名;#回收閑置的數(shù)據(jù)庫(kù)空間。
1. 優(yōu)化表 與 表大小碎片相關(guān)
注:當(dāng)表上的數(shù)據(jù)行被刪除時(shí),所占據(jù)的磁盤空間并沒有立即被回收,使用了OPTIMIZE TABLE
命令后這些空間將被回收,并且對(duì)磁盤上的數(shù)據(jù)行進(jìn)行重排(注意:是磁盤上,而非數(shù)據(jù)庫(kù))。
使用點(diǎn):在批量刪除數(shù)據(jù)行之后,或定期(每周/每月一次)進(jìn)行一次數(shù)據(jù)表優(yōu)化操作即可。
試用范圍:OPTIMIZE TABLE只對(duì)MyISAM, BDB和InnoDB表起作用.
注意點(diǎn):optimize在對(duì)表進(jìn)行操作的時(shí)候,會(huì)加鎖,所以不宜經(jīng)常在程序中調(diào)用。
看到數(shù)據(jù)碎片:
show table status; #獲取表信息
show table status like ‘表名’ ; #獲取某個(gè)表的詳細(xì)信息
show table status like ‘表名’ \G; #獲取某個(gè)表的詳細(xì)信息 #加 \G 可以格式化輸出
數(shù)據(jù)總大?。? DATA_LENGTH + INDEX_LENGTH #表的數(shù)據(jù)量+索引占大小
實(shí)際表空間大小:TABLE_ROWS * AVG_ROW_LENGTH #行數(shù)*每行的實(shí)平均字節(jié)數(shù)
碎片大小:( DATA_LENGTH+INDEX_LENGTH-TABLE_ROWS*AVG_ROW_LENGTH)/1024/1024/
所以:實(shí)際表的大小另一種算法:DATA_LENGTH + INDEX_LENGTH -Data_free;


xiawucha2.png
2. 修復(fù)表(先介紹下mysql三文件)
- 創(chuàng)建表時(shí)會(huì)發(fā)生如下結(jié)果:
(1)MYSQL創(chuàng)建一個(gè)磁盤文件,擴(kuò)展名為.frm, 用于保護(hù)表格式。
(2)存儲(chǔ)引擎會(huì)為表再創(chuàng)建幾個(gè)特定的文件, 用于存儲(chǔ)表內(nèi)容。
存儲(chǔ)引擎:InnoDB 磁盤文件 .idb
存儲(chǔ)引擎:MyISAM 數(shù)據(jù).MYD , 索引 .MYI
存儲(chǔ)引擎:CSV 數(shù)據(jù).CSV, 元數(shù)據(jù) .CSM
存儲(chǔ)引擎:MEMORY 存儲(chǔ)引擎把表放在內(nèi)存里,而非磁盤上。
- 格式 : repair table 表名 [選項(xiàng)]
選項(xiàng)如下:
QUICK : 用在數(shù)據(jù)表還沒被修改的情況下,速度最快
EXTENDED :試圖去恢復(fù)每個(gè)數(shù)據(jù)行,會(huì)產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用
USE_FRM :用在.MYI文件丟失或者頭部受到破壞的情況下。
即利用.frm的定義來重建索引
注: 當(dāng).MYI文件丟失或頭部受到破壞時(shí), repair table 表名 命令將無效,需要加上選項(xiàng)3。
注:對(duì)于MyISAM引擎,想損壞表直接刪除索引文件(.MYI)即可。
- 格式2: 用mysql內(nèi)建命令mysqlcheck來修復(fù)表, 優(yōu)化表。 先略
例子:/SE/MYSQL/庫(kù)名/ 有所有數(shù)據(jù)表的三種文件。
首先: 刪除xiawucha_3000_table.MYI 索引文件;
然后: 檢查數(shù)據(jù)表是否損壞: check table xiawucha_3000_table
最后: 修復(fù)表。

xiawucha3.png

xiawucha4.png
二. 創(chuàng)建表選項(xiàng)
方式1: 直接創(chuàng)建
create table 表名(\
serial_num 類型 unsigned primary key auto_increment ,\
id 類型 NOT NULL ,\
Version 類型 NOT NULL ,\
time 類型 ,\
dev 類型 NOT NULL ,\
....
vsid 類型 NOT NULL,\
INDEX vsid_id(vsid) \
) engine=MyISAM default charset=utf8;
注: serial_num列--》 主鍵 且 自增;
注: 存儲(chǔ)引擎:engine=MyISAM
注: 默認(rèn)編碼:default charset=utf8
方式2:create table 表2 like 表1;
例子1: create table t2 as select * from t1 where 1=2; 或者 limit 0;
特點(diǎn):as賦值表的方式,只復(fù)制表結(jié)構(gòu),沒有復(fù)制索引。復(fù)制數(shù)據(jù)。
例子2: create table t2 like t1 ;
特點(diǎn):like 創(chuàng)建出來的新表包含源表的完整表結(jié)構(gòu)和索引信息。
特點(diǎn):與原表區(qū)別: 表名不同, 沒有源表的數(shù)據(jù)。
二者的用途:
as: 用來創(chuàng)建相同表結(jié)構(gòu)并復(fù)制源表數(shù)據(jù)。
like:用來創(chuàng)建完整表結(jié)構(gòu)和全部索引(并不復(fù)制數(shù)據(jù))。
方式3:mysql使用MRG_MyISAM(MERGE)實(shí)現(xiàn)水平分表
比如在方式1的最后一句替換如下:
ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO UNION=(‘表1’,`表2`)
其中:INSERT_METHOD屬性說明:
0 /no不允許插入(最好用NO) #即:該表不可以插入數(shù)據(jù)。
FIRST 插入到UNION中的第一個(gè)表
LAST 插入到UNION中的最后一個(gè)表
其中:MRG_MYISAM用來實(shí)現(xiàn)分表(讀寫分離)
其中:UNION 用于把多個(gè)表的查詢結(jié)果組合到一個(gè)結(jié)果集合中。
即:該表為主表,是其余多個(gè)表的集合,該表只可查詢,不可以插入。
該例子來源于網(wǎng)絡(luò)
1.首先:創(chuàng)建3張子表
CREATE TABLE `customer1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; #創(chuàng)建表1
create table customer2 like customer1; #創(chuàng)建表2
create table customer3 like customer1; #創(chuàng)建表3
2. 然后:創(chuàng)建主表,ENGINE指定為MRG_MyISAM( INSERT_METHOD設(shè)置為NO 只讀)
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` int(1) NOT NULL DEFAULT '0',
KEY `id` (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8
INSERT_METHOD=NO UNION=(`customer1`,`customer2`,`customer3`);
3. 最后插入數(shù)據(jù):
只能往三個(gè)子表插入數(shù)據(jù),不可往主表插入數(shù)據(jù)。
注:三個(gè)子表的數(shù)據(jù),都可以從主表中查詢。
水平分表可能存在的問題:
1. 自增建的問題 AUTO_INCREMENT:
首先:AUTO_INCREMENT 是對(duì)一張表而言的,后插入該表的日志該建的值會(huì)連續(xù)增大。
然后: 當(dāng)分表后,從一張表到另一張表,兩者的自增建是獨(dú)立的,所以需要獲取前張表的
自增建的值最大值作為下一張表的初始值。
2. 表的切換問題:
情景1: 當(dāng)前一張子表達(dá)到一定大小/一定時(shí)間,會(huì)換另一張表;如果表的數(shù)量沒有限制,
只需要保證 重啟后,還能將最新的數(shù)據(jù)存入重啟前的當(dāng)前表 (或存入一張新表)。
情景2: 當(dāng)對(duì)表的數(shù)量(或大?。┯邢拗茣r(shí),需要記錄當(dāng)前存儲(chǔ)的表,并保障重啟后還能存入
當(dāng)前表;且在存入下一張表前,需要先將下一張表清空。
三. 刪除表
方式1: drop table 表名; 或者 drop table if exists `表名`;
特點(diǎn): drop將表格直接刪除,沒有辦法找回。刪除內(nèi)容和定義,釋放空間。
方式2:truncate table 表名;
特點(diǎn): 刪除表中的所有數(shù)據(jù),不能與where一起使用。
truncate是DDL語(yǔ)言, 操作立即生效,自動(dòng)提交,原數(shù)據(jù)不放到 rollback segment中,
不能回滾。刪除內(nèi)容、釋放空間但不刪除表的結(jié)構(gòu)(定義)。
方式3:
刪除整張表數(shù)據(jù): delete from 表名;
刪除表的部分?jǐn)?shù)據(jù):delete from 表名 where ....;
特點(diǎn): 屬于DML語(yǔ)言,每次刪除一行,都在事務(wù)日志中為所刪除的每行記錄一項(xiàng);
刪除表中數(shù)據(jù)而不刪除表的結(jié)構(gòu)(定義),同時(shí)也不釋放空間。
區(qū)別:對(duì)于“事務(wù)”--》truncate是不可以rollback的,但是delete是可以:
因?yàn)椋簍runcate刪除整表數(shù)據(jù)隱式提交),delete是一行一行的刪除。
執(zhí)行速度: drop > truncate > delete。 其中:
drop刪除數(shù)據(jù),結(jié)構(gòu),釋放空間;
Truncate 并不刪除結(jié)構(gòu)(表和索引所占用的空間會(huì)恢復(fù)到初始大小);
delete只刪除數(shù)據(jù)(表和索引所占用的空間不變)。