九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
高性能MySQL小結(jié)

高性能MySQL小結(jié)

其實(shí)只看到了1/3,先記錄一下,等以后有空了再補(bǔ)上。

將查詢結(jié)果導(dǎo)出到文件

mysql > SQL QUERY INTO OUTFILE '/path/to/sql/file'

將每次操作都導(dǎo)出到文件

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)

顯示MySQL當(dāng)前狀態(tài)及其他信息

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; //類似上面

顯示MySQL當(dāng)前的連接狀況

# 使用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 |+-----+------+-----------+------+---------+------+-------+------------------+

關(guān)于TIMESTAMP

  • 第一個(gè)TIMESTAMP字段會(huì)隨著表其他字段的更新而自動(dòng)更新,之后的TIMESTAMP字段則不會(huì)。
  • TIMESTAMP的范圍是:1970-2037;而DATETIME的范圍是:1000-9999

移除重復(fù)的行

# 注意這個(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);

查看當(dāng)前在操作的數(shù)據(jù)庫(kù)

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]> \\ 

復(fù)制一個(gè)表

CREATE TABLE tbl1 LIKE tbl;INSERT INTO tbl1 SELECT * FROM tbl;# 也可以先用mysqladmin導(dǎo)出數(shù)據(jù),再導(dǎo)入

定長(zhǎng)表與變長(zhǎng)表

包含任何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

轉(zhuǎn)換編碼

SET NAMES utf8# CHARSET utf8

聚合函數(shù)

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部分有效。(不好理解,忽略)

并發(fā)控制

讀鎖(共享鎖)/寫鎖(排他鎖)

當(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ù)安全之間尋求一種平衡。

表鎖(MyISAM)

開銷最小,但不適合頻繁寫操作

行鎖(InnoDb)

可以支持最大的并發(fā)處理,但同時(shí)也會(huì)增加開銷(InnoDb),由存儲(chǔ)引擎實(shí)現(xiàn),而不是MySQL服務(wù)器

事務(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

多版本并發(fā)控制

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)加鎖

關(guān)于MyISAM

  • 表加鎖。并發(fā)低/開銷少
  • 將每個(gè)表存儲(chǔ)成兩個(gè)文件:數(shù)據(jù)文件(.MYD)和索引文件(.MYI)
  • 使用CHECK TABLE mytable 和 REPAIR TABLE mytable來(lái)修復(fù)表,也可以使用myisamchk命令
  • 索引長(zhǎng)度不能超過(guò)1000(注意,如果是utf8的話,長(zhǎng)度x3),InnoDb沒(méi)有此限制
  • 可以延遲索引。使用表創(chuàng)建選項(xiàng)DELAY_KEY_WRITE創(chuàng)建的MyISAM表,在SQL結(jié)束之后,不會(huì)將索引的改變數(shù)據(jù)寫入磁盤,而是在內(nèi)存的鍵緩沖區(qū)中緩存索引改變數(shù)據(jù),只有在清理緩沖區(qū)或關(guān)閉表時(shí)才將索引塊轉(zhuǎn)到磁盤。對(duì)于數(shù)據(jù)經(jīng)常改變,并且頻繁使用的表,這種模式大大提高了表的處理性能。不過(guò),如果服務(wù)器或系統(tǒng)崩潰,索引將肯定損壞,并需要修復(fù)

關(guān)于InnoDb

  • 行級(jí)鎖。并發(fā)高/開銷相對(duì)高
  • 高性能
  • 崩潰后自動(dòng)恢復(fù)
  • 主鍵聚簇索引,輔助索引非聚簇索引(單獨(dú)索引樹),輔助索引也會(huì)包含主鍵列,所以如果主鍵列較大,則它的輔助索引也會(huì)較大
  • 任何改變InnoDb表結(jié)構(gòu)的操作會(huì)導(dǎo)致整個(gè)表的重建,包括重建所有索引
  • 外鍵約束
  • 自動(dòng)提交性能差?
  • 可以顯示鎖定
  • 不要對(duì)InnoDb使用不帶WHERE語(yǔ)句的count(*),這會(huì)導(dǎo)致InnoDb執(zhí)行全表掃描或索引掃描,而MyISAM只需要從相關(guān)記錄中讀取該值即可。

性能檢測(cè)

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, ...

關(guān)于NULL

  • 盡量避免NULL
  • MySQL難以優(yōu)化引用了可空列的查詢,它會(huì)使索引,索引統(tǒng)計(jì)和值更加復(fù)雜
  • 即使要在表中存儲(chǔ)"沒(méi)有值"的字段,還是有可能不使用NULL的,考慮使用0或空字符來(lái)代替它。

索引

索引是性能問(wèn)題的首要原因,先搞定索引,再去搞查詢優(yōu)化

B-Tree索引

  • 根節(jié)點(diǎn)保存了指向子節(jié)點(diǎn)的指針,存儲(chǔ)引擎根據(jù)指針尋找數(shù)據(jù)
  • 當(dāng)一個(gè)數(shù)據(jù)塊不能放下所有索引字段數(shù)據(jù)時(shí),就會(huì)形成樹形的根節(jié)點(diǎn)或分支節(jié)點(diǎn),所以樹的深度和廣度是由數(shù)據(jù)量決定的
  • 每個(gè)節(jié)點(diǎn)包含了下層節(jié)點(diǎn)的鏈接,(沒(méi)有相鄰節(jié)點(diǎn)鏈接,上層鏈接可有可沒(méi)有)

假設(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中使用索引

聚集索引 (InnoDb)

當(dāng)表有聚集索引時(shí),它的數(shù)據(jù)行實(shí)際保存在索引的葉子頁(yè)(而不是指針),所謂"聚集"就是指實(shí)際的數(shù)據(jù)行和相關(guān)的鍵值都保存在一起,每個(gè)表只能由一個(gè)聚集索引(主索引),因?yàn)椴荒芤源税研斜4嬖趦蓚€(gè)地方

優(yōu)點(diǎn):

  • 可以把相關(guān)數(shù)據(jù)保存在一起。如果沒(méi)有使用聚集,讀取每個(gè)郵件都會(huì)訪問(wèn)磁盤
  • 數(shù)據(jù)訪問(wèn)快。聚集索引把索引和數(shù)據(jù)都保存到了同一棵B-Tree中,因此從聚集索引中取得的數(shù)據(jù)通常比在非聚集索引進(jìn)行查找要快
  • 聚集索引能最大限度地提升I/O密集負(fù)載的性能。

缺點(diǎn):

  • 更新索引列代價(jià)是龐大的,因?yàn)樗鼜?qiáng)制InnoDb把每個(gè)更新的行移到新位置
  • 輔助索引會(huì)比較大,因?yàn)樗鼈兊娜~子包含了被引用行的主鍵列
  • 輔助索引訪問(wè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í)又可以使用覆蓋索引,速度就快多了

多余和重復(fù)索引

  • MySQL允許你在統(tǒng)一列上創(chuàng)建多個(gè)索引,所以MySQL不得不單獨(dú)維護(hù)每一個(gè)索引
  • 如果列(A,B)上有索引,那么另外一個(gè)列(A)上的索引就是多余的(B-Tree)
  • 大多數(shù)情況下,多余索引都是不好的,為了避免它,應(yīng)該擴(kuò)展已有索引,而不是添加新索引
  • 索引越多,更新索引的開銷越大,尤其是在數(shù)據(jù)很多的情況下

--EOF--

若無(wú)特別說(shuō)明,本站文章均為原創(chuàng),轉(zhuǎn)載請(qǐng)保留鏈接,謝謝

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Mysql
通過(guò)MySQL存儲(chǔ)原理來(lái)分析排序和鎖
并發(fā)控制 mysql InnoDB表鎖
萬(wàn)字總結(jié) MySQL核心知識(shí),贈(zèng)送25連環(huán)炮
順豐快遞:請(qǐng)簽收MySQL靈魂十連問(wèn)
數(shù)據(jù)庫(kù)兩大必備神器:索引和鎖底層原理是什么!
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服