其實(shí)只看到了1/3,先記錄一下,等以后有空了再補(bǔ)上。
mysql > SQL QUERY INTO OUTFILE '/path/to/sql/file'
mysql > \T /path/to/filemysql > ... //這些操作,及操作的結(jié)果都會(huì)輸出到對(duì)應(yīng)的文件mysql > \t
文件內(nèi)容大概會(huì)是這樣
(root@localhost) [(none)]> use noah;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changed(root@localhost) [noah]> show tables;+----------------+| Tables_in_noah |+----------------+| blog_category || blog_comment || blog_post || blog_res || blog_role || blog_role_res || blog_role_user || blog_tag || blog_user || test |+----------------+10 rows in set (0.00 sec)(root@localhost) [noah]> select * from test;+----+------+| id | name |+----+------+| 1 | foo || 2 | bar |+----+------+2 rows in set (0.02 sec)
SHOW STATUS; //顯示MySQL當(dāng)前狀態(tài)SHOW VARIABLES; //顯示MySQL的變量信息,如version/data_dir等等SHOW VARIABLES LIKE '%home%'; //獲取包含home的變量SHOW TABLE STATUS\G //顯示當(dāng)前表的狀態(tài),注意后面的\G,垂直顯示結(jié)果DESCRIBE tbl; //獲取表結(jié)構(gòu)SHOW FULL COLUMNS FROM tbl; //類似上面
# 使用mysqladminmysqladmin processlist# 或進(jìn)入到mysql cli后執(zhí)行mysql > show processlist;# 結(jié)果大概是這樣+-----+------+-----------+------+---------+------+-------+------------------+| Id | User | Host | db | Command | Time | State | Info |+-----+------+-----------+------+---------+------+-------+------------------+| 409 | root | localhost | noah | Query | 0 | NULL | show processlist |+-----+------+-----------+------+---------+------+-------+------------------+
# 注意這個(gè)IGNORE參數(shù),如果沒(méi)加的話會(huì)報(bào)錯(cuò),且執(zhí)行失敗# 假設(shè)要去除a,b項(xiàng)重復(fù)的行ALTER IGNORE TABLE tbl ADD UNIQUE INDEX(a,b);
SELECT DATABASE();
也可以在mysql的提示符上動(dòng)點(diǎn)手腳
# edit /etc/mysql/my.cnf[mysql]#no-auto-rehash # faster start of mysql but no tab completitionprompt=(\\u@\\h) [\\d]> \\
CREATE TABLE tbl1 LIKE tbl;INSERT INTO tbl1 SELECT * FROM tbl;# 也可以先用mysqladmin導(dǎo)出數(shù)據(jù),再導(dǎo)入
包含任何varchar、text等變長(zhǎng)字段的數(shù)據(jù)表,即為變長(zhǎng)表,反之則為定長(zhǎng)表。所以CHAR和VARCHAR不共存
CHAR,最多可以容納30個(gè)字符,但如果字符數(shù)不到30個(gè)的話,也會(huì)占用這些空間,只不過(guò)會(huì)在后面補(bǔ)上空格,但我們查詢時(shí)又會(huì)發(fā)現(xiàn)尾部沒(méi)有空格,這是因?yàn)榭崭褚呀?jīng)被CHAR處理掉了。
VARCHAR,也是最多可以容納30個(gè)字符,但如果不足30個(gè)的話,有多少字符占多少空間,不會(huì)浪費(fèi)。
變長(zhǎng)表的優(yōu)勢(shì)在于有效利用空間,但由于記錄大小不同,在其上進(jìn)行許多刪除或更新操作會(huì)使表中的碎片增多,需要定期OPTIMIZE TABLE以保持性能。
定長(zhǎng)表的查詢,檢索和更新速度都比變長(zhǎng)表快,但占用的空間也大。
PS:MySQL 5.0.3之后VARCHAR的最大字符數(shù)為65535
SET NAMES utf8# CHARSET utf8
COUNT [GROUP BY]COUNT + HAVING + GROUP BY (HAVING可以看作后置WHERE語(yǔ)句)MIN/MAX [GROUP BY]SUM/AVG [GROUP BY]DISTINCT [GROUP BY]所有的這些聚合函數(shù)加上GROUP BY之后,都只對(duì)GROUP BY部分有效。(不好理解,忽略)
當(dāng)某一用戶修改一部分?jǐn)?shù)據(jù)時(shí),MySQL會(huì)禁止其他用戶讀取同一數(shù)據(jù)。大多數(shù)時(shí),MySQL都是以透明的方式實(shí)現(xiàn)鎖的內(nèi)部管理
只鎖定部分修改的數(shù)據(jù),而不是所有的資源,或者只對(duì)要修改的數(shù)據(jù)片精確加鎖。任何時(shí)間,在給定的資源上,被加鎖的數(shù)據(jù)量越小,就可以允許更多的并發(fā)修改,只要相互之間互不沖突即可
這么做的問(wèn)題是加鎖也會(huì)消耗系統(tǒng)資源。如獲得鎖,檢查鎖是否已解除,以及釋放鎖等,都會(huì)增加系統(tǒng)開銷。如果系統(tǒng)花費(fèi)大量時(shí)間來(lái)管理鎖,而不是讀/寫數(shù)據(jù),那么系統(tǒng)整體性能都可能會(huì)受到影響
所謂的鎖策略,就是在鎖開銷和數(shù)據(jù)安全之間尋求一種平衡。
開銷最小,但不適合頻繁寫操作
可以支持最大的并發(fā)處理,但同時(shí)也會(huì)增加開銷(InnoDb),由存儲(chǔ)引擎實(shí)現(xiàn),而不是MySQL服務(wù)器
一組原子性的SQL語(yǔ)句。要么全部執(zhí)行(commit),要么全部不執(zhí)行(rollback)
正像鎖粒度的增加會(huì)導(dǎo)致鎖開銷的增加一樣,這種事務(wù)處理中的額外安全措施,也會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器要完成更多的額外工作
MySQL默認(rèn)操作是AutoCommit,這意味著除非顯示地開始一個(gè)事務(wù),否則將把每個(gè)SQL操作視為一個(gè)單獨(dú)事務(wù)自動(dòng)執(zhí)行
兩個(gè)或多個(gè)事務(wù)在同一資源上相互占用,并請(qǐng)求加鎖時(shí),導(dǎo)致的惡性循環(huán)現(xiàn)象
解決辦法:死鎖檢測(cè)/死鎖超時(shí)機(jī)制。InnoDb處理死鎖的方法是,回滾擁有最少排他行級(jí)鎖的事務(wù)。
InnoDb: 一個(gè)事務(wù)在執(zhí)行過(guò)程中的任何時(shí)候,都可以獲得鎖,但只有在執(zhí)行COMMIT或ROLLBACK語(yǔ)句后,才可以釋放這些鎖。
InnoDb也支持顯式鎖定,如:
SELECT ... LOCK IN SHARE MODESELECT ... FOR UPDATE
MySQL事務(wù)性存儲(chǔ)引擎,如InnoDb,不是簡(jiǎn)單使用行加鎖機(jī)制,而是MVCC和行加鎖機(jī)制關(guān)聯(lián)使用。
MVCC不是MySQL獨(dú)有的技術(shù),其他如Oracle, Postgresql等都在使用
可以將MVCC設(shè)想成一種行級(jí)加鎖的變形,它避免了很多情況下的鎖操作,大大降低了系統(tǒng)的開銷
MVCC是通過(guò)及時(shí)保存在某些時(shí)刻的數(shù)據(jù)快照,而得以實(shí)現(xiàn)的。
所謂"版本號(hào)",其實(shí)是InnoDb維護(hù)的一個(gè)計(jì)數(shù)器,每啟動(dòng)一個(gè)事務(wù),計(jì)數(shù)器隨著遞增,并將該號(hào)作為事務(wù)的版本號(hào)
[INSERT]
InnoDb將系統(tǒng)當(dāng)前的版本號(hào)設(shè)為新增行的版本號(hào)
[DELETE]
InnoDb將系統(tǒng)當(dāng)前的版本號(hào)設(shè)為被刪除行的刪除號(hào),該行并未立即被物理刪除
[UPDATE]
INSERT+DELETE
[SELECT]
1. 行版本號(hào)不大于事務(wù)版本號(hào)。這確保了該行在事務(wù)開始時(shí)已存在,或者由當(dāng)前事務(wù)創(chuàng)建、更新
2. 行刪除號(hào)不存在,或者刪除號(hào)大于事務(wù)版本號(hào)。這確保事務(wù)開始前行未被刪除
對(duì)于被標(biāo)記為刪除的行,InnoDb有專門的線程負(fù)責(zé)物理刪除,當(dāng)行滿足如下條件時(shí)認(rèn)為可以將其物理刪除:當(dāng)前不存在版本號(hào)小于該行刪除號(hào)的事務(wù),這樣可以確保不會(huì)有事務(wù)再引用到該行
保存這些額外記錄的好處,是使大多數(shù)讀操作都不必申請(qǐng)加鎖
mysql > SET PROFILING = 1;mysql > ...mysql > SHOW PROFILES;
會(huì)把執(zhí)行的語(yǔ)句和執(zhí)行時(shí)間都打印出來(lái),如下
+----------+------------+-----------------------------------+| Query_ID | Duration | Query |+----------+------------+-----------------------------------+| 1 | 0.00011700 | select count(*) from user || 2 | 0.00033500 | select count(*) from user_copy || 3 | 0.59868300 | select count(created) from user || 4 | 0.51746400 | select count(name) from user_copy || 5 | 0.00846700 | show table status like 'user' |+----------+------------+-----------------------------------+
還可以針對(duì)某個(gè)query進(jìn)行更細(xì)致的分析
也可以使用FLUSH STATUS + SHOW SESSION STATUS
mysql > SHOW PROFILE FOR QUERY 1;
MySQL在第二次執(zhí)行相同的SQL查詢語(yǔ)句時(shí),默認(rèn)會(huì)使用查詢緩存。加上"SQL_NO_CACHE"不使用查詢緩存
SELECT SQL_NO_CACHE username, ...
索引是性能問(wèn)題的首要原因,先搞定索引,再去搞查詢優(yōu)化
假設(shè)建立了一個(gè)(last_name, first_name, birth)的索引,此索引對(duì)于以下類型可用
匹配全名 (例如可以找到一個(gè)叫Cuba Allen,并且出生于1960-01-01的人)
匹配最左前綴 (例如可以找到姓為Allen的人,僅適用于索引中的第一列)
由于樹的節(jié)點(diǎn)是排好序的,它們可以用于查找和ORDER BY查詢
B-Tree的局限在于如果查詢不是從索引列的最左邊開始,就無(wú)法使用索引。所以索引列的順序至關(guān)重要。
如果在查詢中沒(méi)有隔離索引的列,MySQL通常不會(huì)是使用索引。"隔離"列意味著它不是表達(dá)式的一部分,也沒(méi)有位于函數(shù)中。
找到合適的前綴長(zhǎng)度(計(jì)算全列的選擇性,并使前綴的選擇性接近于它)
SELECT COUNT(DISTINCT city)/COUNT(*) FROM city_demoSELECT COUNT(DISTINCE LEFT(city, 4))/COUNT(*) FROM city_demo
也要注意如果數(shù)據(jù)分布非常不均勻,可能就會(huì)有問(wèn)題
前綴索引能很好的減少索引的大小及提高速度,但MySQL不能在ORDER BY和GROUP BY中使用索引
當(dāng)表有聚集索引時(shí),它的數(shù)據(jù)行實(shí)際保存在索引的葉子頁(yè)(而不是指針),所謂"聚集"就是指實(shí)際的數(shù)據(jù)行和相關(guān)的鍵值都保存在一起,每個(gè)表只能由一個(gè)聚集索引(主索引),因?yàn)椴荒芤源税研斜4嬖趦蓚€(gè)地方
優(yōu)點(diǎn):
缺點(diǎn):
所有滿足查詢需要的數(shù)據(jù)的索引(只需要讀取索引,不需要再讀取行數(shù)據(jù)),比如這條SQL語(yǔ)句
SELECT state_id, city, address FROM userinfo WHERE state_id = 5
如果只在state_id上建索引,則city,address都要從表里讀取行數(shù)據(jù)
如果建立index (state_id, city, address),既能使用state_id索引,同時(shí)又可以使用覆蓋索引,速度就快多了
若無(wú)特別說(shuō)明,本站文章均為原創(chuàng),轉(zhuǎn)載請(qǐng)保留鏈接,謝謝
聯(lián)系客服