使用
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),永川企業(yè)網(wǎng)站建設(shè),永川品牌網(wǎng)站建設(shè),網(wǎng)站定制,永川網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,永川網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
unbuffered
cursor
可以避免內(nèi)存問(wèn)題。
cursor
默認(rèn)使用
buffered
模式。這種模式會(huì)把所有結(jié)果集返回并載入內(nèi)存。如果結(jié)果集很大的話(huà),內(nèi)存會(huì)爆。
unbuffered
cursor
是每次只將下一行結(jié)果返回,內(nèi)存占用很小。不過(guò)這種模式缺點(diǎn)很多,所以沒(méi)有作為默認(rèn)的模式。
內(nèi)存表有大小限制,內(nèi)存文件超過(guò) my.ini 中設(shè)置以后,會(huì)自動(dòng)轉(zhuǎn)換部分到硬盤(pán)。內(nèi)存表所占內(nèi)存以固定的大小分配空間,即使一個(gè)表中只有一條記錄,也可能占幾M空間。內(nèi)存表是有大小限制的,在 my.ini 中可以設(shè)置,當(dāng)內(nèi)存大小達(dá)到限制時(shí),可能會(huì)報(bào)錯(cuò):#1114: The table ‘XXX’ is full 。上面是我實(shí)際遭遇到的,但是 my.ini 中有下面這段:
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=13M
我們?nèi)匀皇褂脙蓚€(gè)會(huì)話(huà),一個(gè)會(huì)話(huà) run,用于運(yùn)行主 SQL;另一個(gè)會(huì)話(huà) ps,用于進(jìn)行 performance_schema 的觀察:
主會(huì)話(huà)線(xiàn)程號(hào)為 29,
將 performance_schema 中的統(tǒng)計(jì)量重置,
臨時(shí)表的表大小限制取決于參數(shù)? tmp_table_size 和 max_heap_table_size 中較小者,我們實(shí)驗(yàn)中以設(shè)置 max_heap_table_size 為例。
我們將會(huì)話(huà)級(jí)別的臨時(shí)表大小設(shè)置為 2M(小于上次實(shí)驗(yàn)中臨時(shí)表使用的空間),執(zhí)行使用臨時(shí)表的 SQL:
查看內(nèi)存的分配記錄:
會(huì)發(fā)現(xiàn)內(nèi)存分配略大于 2M,我們猜測(cè)臨時(shí)表會(huì)比配置略多一點(diǎn)消耗,可以忽略。
查看語(yǔ)句的特征值:
可以看到語(yǔ)句使用了一次需要落磁盤(pán)的臨時(shí)表。
那么這張臨時(shí)表用了多少的磁盤(pán)呢?
我們開(kāi)啟 performance_schema 中 waits 相關(guān)的統(tǒng)計(jì)項(xiàng):
重做實(shí)驗(yàn),略過(guò)。
再查看 performance_schema 的統(tǒng)計(jì)值:
可以看到幾個(gè)現(xiàn)象:
1. 臨時(shí)表空間被寫(xiě)入了 7.92MiB 的數(shù)據(jù)。
2. 這些數(shù)據(jù)是語(yǔ)句寫(xiě)入后,慢慢逐漸寫(xiě)入的。
來(lái)看看這些寫(xiě)入操作的特征,該方法我們?cè)?實(shí)驗(yàn) 03?使用過(guò):
可以看到寫(xiě)入的線(xiàn)程是 page_clean_thread,是一個(gè)刷臟操作,這樣就能理解數(shù)據(jù)為什么是慢慢寫(xiě)入的。
也可以看到每個(gè) IO 操作的大小是 16K,也就是刷數(shù)據(jù)頁(yè)的操作。
結(jié)論:
我們可以看到,
1. MySQL 會(huì)基本遵守 max_heap_table_size 的設(shè)定,在內(nèi)存不夠用時(shí),直接將表轉(zhuǎn)到磁盤(pán)上存儲(chǔ)。
2. 由于引擎不同(內(nèi)存中表引擎為 heap,磁盤(pán)中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實(shí)驗(yàn)寫(xiě)磁盤(pán)的數(shù)據(jù)量和?實(shí)驗(yàn) 05?中使用內(nèi)存的數(shù)據(jù)量不同。
3. 如果臨時(shí)表要使用磁盤(pán),表引擎配置為 InnoDB,那么即使臨時(shí)表在一個(gè)時(shí)間很短的 SQL 中使用,且使用后即釋放,釋放后也會(huì)刷臟頁(yè)到磁盤(pán)中,消耗部分 IO。
作用是內(nèi)存的大小可通過(guò)My.cnf中的max_heap_table_size指定。
MySQL的授權(quán)系統(tǒng)是通過(guò)MySQL數(shù)據(jù)庫(kù)中的五個(gè)表來(lái)實(shí)現(xiàn)的,這些表有user、db、host、tables_priv和columns_priv。這些表的用途各有不同,但是有一點(diǎn)是一致的,那就是都能夠檢驗(yàn)用戶(hù)要做的事情是否為被允許的。
擴(kuò)展資料
mysql數(shù)據(jù)庫(kù)表包含的授權(quán)信息
1、user:用戶(hù)帳戶(hù),全局權(quán)限和其他非特權(quán)列
2、db:數(shù)據(jù)庫(kù)級(jí)權(quán)限
3、tables_priv:表級(jí)特權(quán)
4、columns_priv:列級(jí)權(quán)限
5、procs_priv:存儲(chǔ)過(guò)程和功能特權(quán)
6、proxies_priv:代理用戶(hù)權(quán)限
Linux 進(jìn)程通過(guò) C 標(biāo)準(zhǔn)庫(kù)中的內(nèi)存分配函數(shù) malloc 向系統(tǒng)申請(qǐng)內(nèi)存,但是到真正與內(nèi)核交互之間,其實(shí)還隔了一層,即內(nèi)存分配管理器(memory allocator)。常見(jiàn)的內(nèi)存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默認(rèn)使用的是 glibc 的 ptmalloc 作為內(nèi)存分配器。
內(nèi)存分配器采用的是內(nèi)存池的管理方式,處在用戶(hù)程序?qū)雍蛢?nèi)核層之間,它響應(yīng)用戶(hù)的分配請(qǐng)求,向操作系統(tǒng)申請(qǐng)內(nèi)存,然后將其返回給用戶(hù)程序。
為了保持高效的分配,分配器通常會(huì)預(yù)先向操作系統(tǒng)申請(qǐng)一塊內(nèi)存,當(dāng)用戶(hù)程序申請(qǐng)和釋放內(nèi)存的時(shí)候,分配器會(huì)將這些內(nèi)存管理起來(lái),并通過(guò)一些算法策略來(lái)判斷是否將其返回給操作系統(tǒng)。這樣做的最大好處就是可以避免用戶(hù)程序頻繁的調(diào)用系統(tǒng)來(lái)進(jìn)行內(nèi)存分配,使用戶(hù)程序在內(nèi)存使用上更加高效快捷。
關(guān)于 ptmalloc 的內(nèi)存分配原理,個(gè)人也不是非常了解,這里就不班門(mén)弄斧了,有興趣的同學(xué)可以去看下華庭的《glibc 內(nèi)存管理 ptmalloc 源代碼分析》【文末鏈接】。
關(guān)于如何選擇這三種內(nèi)存分配器,網(wǎng)上資料大多都是推薦摒棄 glibc 原生的 ptmalloc,而改用 jemalloc 或者 tcmalloc 作為默認(rèn)分配器。因?yàn)?ptmalloc 的主要問(wèn)題其實(shí)是內(nèi)存浪費(fèi)、內(nèi)存碎片、以及加鎖導(dǎo)致的性能問(wèn)題,而 jemalloc 與 tcmalloc 對(duì)于內(nèi)存碎片、多線(xiàn)程處理優(yōu)化的更好。
目前 jemalloc 應(yīng)用于 Firefox、FaceBook 等,并且是 MariaDB、Redis、Tengine 默認(rèn)推薦的內(nèi)存分配器,而 tcmalloc 則應(yīng)用于 WebKit、Chrome 等。
說(shuō)一下臨時(shí)表,僅供參考。
MySQL 需要?jiǎng)?chuàng)建隱式臨時(shí)表來(lái)解決某些類(lèi)型的查詢(xún)。往往查詢(xún)的排序階段需要依賴(lài)臨時(shí)表。例如,當(dāng)您使用 GROUP BY,ORDER BY 或DISTINCT 時(shí)。這樣的查詢(xún)分兩個(gè)階段執(zhí)行:首先是收集數(shù)據(jù)并將它們放入臨時(shí)表中,然后是在臨時(shí)表上執(zhí)行排序。
對(duì)于某些 UNION 語(yǔ)句,不能合并的 VIEW,子查詢(xún)時(shí)用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時(shí)表。如果臨時(shí)表很小,可以到內(nèi)存中創(chuàng)建,否則它將在磁盤(pán)上創(chuàng)建。MySQL 在內(nèi)存中創(chuàng)建了一個(gè)表,如果它變得太大,就會(huì)被轉(zhuǎn)換為磁盤(pán)上存儲(chǔ)。內(nèi)存臨時(shí)表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為準(zhǔn)。MySQL 5.7 中的默認(rèn)大小為 16MB。如果運(yùn)行查詢(xún)的數(shù)據(jù)量較大,或者尚未查詢(xún)優(yōu)化,則可以增加該值。設(shè)置閾值時(shí),請(qǐng)考慮可用的 RAM 大小以及峰值期間的并發(fā)連接數(shù)。你無(wú)法無(wú)限期地增加變量,因?yàn)樵谀承r(shí)候你需要讓 MySQL 使用磁盤(pán)上的臨時(shí)表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小于配置的閾值,也會(huì)在磁盤(pán)上創(chuàng)建臨時(shí)表。