本篇內容主要講解“MySQL5.7中有哪些新特性”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL5.7中有哪些新特性”吧!
創(chuàng)新互聯(lián)專注于北海網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供北海營銷型網站建設,北海網站制作、北海網頁設計、北海網站官網定制、成都小程序開發(fā)服務,打造北海網絡公司原創(chuàng)品牌,更為您提供北海網站排名全網營銷落地服務。
1、介紹
mysql5.7中,innodb頁結構增加了一個類型FIL_PAGE_COMPRESSED,用來完成Transparent page compression 特性
2、說明
1)壓縮內容包括:除去FIL_PAGE_DATA外所有數(shù)據(jù),包括tail
2)壓縮后的內容+FIL_PAGE_DATA會以block_size對齊,并將空洞清0。意味著將16K壓縮到9K,也需要12KB的數(shù)據(jù),因此將block_size設小點,這樣的場景將受益,可以
減少空間浪費。
3)FIL_PAGE_VERSION內容存1;FIL_PAGE_ALGORITHM_V1指哪個壓縮算法:ZLIB、LZ4
FIL_PAGE_ORIGINAL_TYPE_V1:原始頁類型;
FIL_PAGE_ORIGINAL_SIZE_V1:原始頁需要壓縮的內容大小
FIL_PAGE_COMPRESS_SIZE_V1:內容壓縮后大小
4)目前支持2種壓縮算法:zlib和lz4,可以方便擴展新的算法
5)壓縮只是在持久化磁盤的時候壓縮,內存中的頁仍然是原始的樣子
3、用法
表定義:
可以通過CREATE TABLE、ALTER TABLE來定義壓縮表:
create table t1(i int,b blob) compression='zlib';
也可以選擇compression='lz4'來指定lz4壓縮算法,注意compression屬性的ALTER是立即生效,在做完ALTER COMPRESSION屬性操作后,需要做一次表的rebuild,例如optimize table操作,才能對已有的數(shù)據(jù)做punch hole。compression屬性存儲在frm文件中,以2個字節(jié)存儲字符串長度,隨后存儲compression屬性定義字符串,這也是一個操作系統(tǒng)降級的風險點。
4、代碼分析
點擊(此處)折疊或打開
static
byte*
os_file_compress_page(
Compression compression,
ulint block_size,//文件系統(tǒng)block大小。通常4K
byte* src,//需要壓縮頁的指針
ulint src_len,//頁大小
byte* dst,//壓縮后,存入目標
ulint* dst_len)//壓縮內存長度
{
ulint len = 0;
ulint compression_level = page_zip_level;
ulint page_type = mach_read_from_2(src + FIL_PAGE_TYPE);
//如果要節(jié)省空間,頁大小至少是文件系統(tǒng)block的2倍。壓縮的頁不包括R-tree頁
if (page_type == FIL_PAGE_RTREE
|| block_size == ULINT_UNDEFINED
|| compression.m_type == Compression::NONE
|| src_len < block_size * 2) {
*dst_len = src_len;
return(src);
}
/* Must compress to <= N-1 FS blocks. */
ulint out_len = src_len - (FIL_PAGE_DATA + block_size);
/* This is the original data page size - the page header. */
ulint content_len = src_len - FIL_PAGE_DATA;
/* Only compress the data + trailer, leave the header alone */
switch (compression.m_type) {
case Compression::NONE:
ut_error;
case Compression::ZLIB: {
uLongf zlen = static_cast<uLongf>(out_len);
if (compress2(
dst + FIL_PAGE_DATA,
&zlen,
src + FIL_PAGE_DATA,
static_cast<uLong>(content_len),
static_cast<int>(compression_level)) != Z_OK) {
*dst_len = src_len;
return(src);
}
len = static_cast<ulint>(zlen);
break;
}
case Compression::LZ4:
len = LZ4_compress_default(
reinterpret_cast<char*>(src) + FIL_PAGE_DATA,
reinterpret_cast<char*>(dst) + FIL_PAGE_DATA,
static_cast<int>(content_len),
static_cast<int>(out_len));
if (len == 0 || len >= out_len) {
*dst_len = src_len;
return(src);
}
break;
default:
*dst_len = src_len;
return(src);
}
/* Copy the header as is. */
memmove(dst, src, FIL_PAGE_DATA);
/* Add compression control information. Required for decompressing. */
mach_write_to_2(dst + FIL_PAGE_TYPE, FIL_PAGE_COMPRESSED);
mach_write_to_1(dst + FIL_PAGE_VERSION, 1);
mach_write_to_1(dst + FIL_PAGE_ALGORITHM_V1, compression.m_type);
mach_write_to_2(dst + FIL_PAGE_ORIGINAL_TYPE_V1, page_type);
mach_write_to_2(dst + FIL_PAGE_ORIGINAL_SIZE_V1, content_len);
mach_write_to_2(dst + FIL_PAGE_COMPRESS_SIZE_V1, len);
/* Round to the next full block size */
len += FIL_PAGE_DATA;
*dst_len = ut_calc_align(len, block_size);
/* Clear out the unused portion of the page. */
if (len % block_size) {
memset(dst + len, 0x0, block_size - (len % block_size));
}
return(dst);
}
到此,相信大家對“MySQL5.7中有哪些新特性”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
文章題目:MySQL5.7中有哪些新特性
文章源于:http://bm7419.com/article30/goicpo.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、面包屑導航、小程序開發(fā)、App設計、定制網站、做網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)