mysql分區(qū)都用什么方法_mysql分區(qū)有哪些方法
MySQL 可應(yīng)用于多種語(yǔ)言,包括 PERL, C, C++, JAVA 和 PHP。大家知道m(xù)ysql分區(qū)有哪些方法嗎?下面由學(xué)習(xí)啦小編為大家整理的mysql分區(qū)的方法,希望大家喜歡!
mysql分區(qū)的方法
一、概述
當(dāng) MySQL的總記錄數(shù)超過(guò)了100萬(wàn)后,會(huì)出現(xiàn)性能的大幅度下降嗎?答案是肯定的,但是,性能下降>的比率不一而同,要看系統(tǒng)的架構(gòu)、應(yīng)用程序、還有>包括索引、服務(wù)器硬件等多種因素而定。當(dāng)有網(wǎng)友問(wèn)我這個(gè)問(wèn)題的時(shí)候,我最常見(jiàn)的回答>就是:分表,可以根據(jù)id區(qū)間或者時(shí)間先后順序等多種規(guī)則來(lái)分表。分表很容易,然而由此所帶來(lái)的應(yīng)用程序甚至是架構(gòu)方面的改動(dòng)工作卻不>容小覷,還包括將來(lái)的擴(kuò)展性等。
在以前,一種解決方案就是使用 MERGE
類(lèi)型,這是一個(gè)非常方便的做飯。架構(gòu)和程序基本上不用做改動(dòng),不過(guò),它的缺點(diǎn)是顯見(jiàn)的:
1.只能在相同結(jié)構(gòu)的 MyISAM 表上使用
2.無(wú)法享受到 MyISAM 的全部功能,例如無(wú)法在 MERGE 類(lèi)型上執(zhí)行 FULLTEXT 搜索
3.它需要使用更多的文件描述符
4.讀取索引更慢
這個(gè)時(shí)候,MySQL 5.1 中新增的分區(qū)(Partition)功能的優(yōu)勢(shì)也就很明顯了:
1.與單個(gè)磁盤(pán)或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)
2.很容易就能刪除不用或者過(guò)時(shí)的數(shù)據(jù)
3.一些查詢(xún)可以得到極大的優(yōu)化
4.涉及到 SUM()/COUNT() 等聚合函數(shù)時(shí),可以并行進(jìn)行
5.IO吞吐量更大
分區(qū)允許可以設(shè)置為任意大小的規(guī)則,跨文件系統(tǒng)分配單個(gè)表的多個(gè)部分。實(shí)際上,表的不同部分在不同的位置被存儲(chǔ)為單獨(dú)的表。
分區(qū)應(yīng)該注意的事項(xiàng):
1、 做分區(qū)時(shí),要么不定義主鍵,要么把分區(qū)字段加入到主鍵中。
2、 分區(qū)字段不能為NULL,要不然怎么確定分區(qū)范圍呢,所以盡量NOT NULL
二、分區(qū)的類(lèi)型
1.RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
2.LIST 分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。
2.HASH分區(qū):基于用戶(hù)定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包>含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
3.KEY分區(qū):類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含>整數(shù)值。
MySQL日志文件方法
1.二進(jìn)制日志
二進(jìn)制日志,也就是我們常說(shuō)的 binlog,也是 MySQL Server 中最為重要的日志之一。
當(dāng)我們通過(guò)“—log-bin[=file_name]”打開(kāi)了記錄的功能之后,MySQL 會(huì)將所有修改數(shù)據(jù) 庫(kù)數(shù)據(jù)的 query 以二進(jìn)制形式記錄到日志文件中。 當(dāng)然, 日志中并不僅限于query 語(yǔ)句這么 簡(jiǎn)單, 還包括每一條query 所執(zhí)行的時(shí)間, 所消耗的資源, 以及相關(guān)的事務(wù)信息,bi所nl以og 是事務(wù)安全的。
和錯(cuò)誤日志一樣,binlog 記錄功能同樣需要“—log-bin[=file_name]”參數(shù)的顯式指 定才能開(kāi)啟, 如果未指定file_name, 則會(huì)在數(shù)據(jù)目錄下記錄為mysql-bin.** (*代表0~ 9 之間的某一個(gè)數(shù)字,來(lái)表示該日志的序號(hào))。
binlog 還有其他一些附加選項(xiàng)參數(shù):
“—max_binlog_size”設(shè)置 binlog 的最大存儲(chǔ)上限,當(dāng)日志達(dá)到該上限時(shí),MySQL 會(huì) 重新創(chuàng)建一個(gè)日志開(kāi)始繼續(xù)記錄。不過(guò)偶爾也有超出該設(shè)置的binlog 產(chǎn)生,一般都是因?yàn)?在即將達(dá)到上限時(shí),產(chǎn)生了一個(gè)較大的事務(wù),為了保證事務(wù)安全,MySQL 不會(huì)將同一個(gè)事務(wù) 分開(kāi)記錄到兩個(gè) binlog 中。
“—binlog-do-db=db_name”參數(shù)明確告訴 MySQL,需要對(duì)某個(gè)(db_name)數(shù)據(jù)庫(kù)記 錄 binlog,如果有了“—binlog-do-db=db_name”參數(shù)的顯式指定,MySQL 會(huì)忽略針對(duì)其他 數(shù)據(jù)庫(kù)執(zhí)行的 query,而僅僅記錄針對(duì)指定數(shù)據(jù)庫(kù)執(zhí)行的query。
“—binlog-ignore-db=db_name”與“—binlog-do-db=db_name”完全相反, 它顯式指 定忽略某個(gè)(db_name)數(shù)據(jù)庫(kù)的binlog 記錄,當(dāng)指定了這個(gè)參數(shù)之后,MySQL 會(huì)記錄指定 數(shù)據(jù)庫(kù)以外所有的數(shù)據(jù)庫(kù)的 binlog。
“—binlog-ignore-db=db_name”與“—binlog-do-db=db_name”兩個(gè)參數(shù)有一個(gè)共同 的概念需要大家理解清楚,參數(shù)中的db_name 不是指 query 語(yǔ)句更新的數(shù)據(jù)所在的數(shù)據(jù)庫(kù), 而是執(zhí)行 query 的時(shí)候當(dāng)前所處的數(shù)據(jù)庫(kù)。 不論更新哪個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù),MySQL 僅僅比較當(dāng) 前連接所處的數(shù)據(jù)庫(kù)(通過(guò)use db_name切換后所在的數(shù)據(jù)庫(kù))與參數(shù)設(shè)置的數(shù)據(jù)庫(kù)名,而 不會(huì)分析 query 語(yǔ)句所更新數(shù)據(jù)所在的數(shù)據(jù)庫(kù)。
mysql-bin.index 文件(binary log index)的功能是記錄所有Binary Log的絕對(duì)路 徑,保證 MySQL 各種線程能夠順利的根據(jù)它找到所有需要的Binary Log 文件。
2.通用查詢(xún)?nèi)罩?/p>
查詢(xún)?nèi)罩居涗?MySQL 中所有的 query,通過(guò)“—log[=fina_name]”來(lái)打開(kāi)該功能。由
于記錄了所有的 query,包括所有的 select,體積比較大,開(kāi)啟后對(duì)性能也有較大的影響, 所以請(qǐng)大家慎用該功能。 一般只用于跟蹤某些特殊的sql 性能問(wèn)題才會(huì)短暫打開(kāi)該功能。默認(rèn)的查詢(xún)?nèi)罩疚募麨?hostname.log。
3.慢查詢(xún)?nèi)罩?/p>
顧名思義,慢查詢(xún)?nèi)罩局杏涗浀氖菆?zhí)行時(shí)間較長(zhǎng)的 query,也就是我們常說(shuō)的 slow
query,通過(guò)設(shè) —log-slow-queries[=file_name]來(lái)打開(kāi)該功能并設(shè)置記錄位置和文件名, 默認(rèn)文件名為 hostname-slow.log,默認(rèn)目錄也是數(shù)據(jù)目錄。
慢查詢(xún)?nèi)罩静捎玫氖呛?jiǎn)單的文本格式, 可以通過(guò)各種文本編輯器查看其中的內(nèi)容。中其 記錄了語(yǔ)句執(zhí)行的時(shí)刻,執(zhí)行所消耗的時(shí)間,執(zhí)行用戶(hù),連接主機(jī)等相關(guān)信息。MySQL 還提 供了專(zhuān)門(mén)用來(lái)分析滿(mǎn)查詢(xún)?nèi)罩镜墓ぞ叱绦騧ysqlslowdump, 用來(lái)幫助數(shù)據(jù)庫(kù)管理人員解決可 能存在的性能問(wèn)題。
4.Innodb的在線redo日志
Innodb 是一個(gè)事務(wù)安全的存儲(chǔ)引擎, 其事務(wù)安全性主要就是通過(guò)在線redo 日志和記錄
在表空間中的 undo 信息來(lái)保證的。redo 日志中記錄了 Innodb 所做的所有物理變更和事務(wù) 信息, 通過(guò)redo 日志和 undo 信息, Innodb 保證了在任何情況下的事務(wù)安全性。Innodb 的redo 日志同樣默認(rèn)存放在數(shù)據(jù)目錄下, 可以通過(guò)innodb_log_group_home_dir來(lái)更改設(shè)置日志的 存放位置,通過(guò) innodb_log_files_in_group 設(shè)置日志的數(shù)量。
5.更新日志
更新日志是 MySQL 在較老的版本上使用的,其功能和 binlog 基本類(lèi)似,只不過(guò)不是以
二進(jìn)制格式來(lái)記錄而是以簡(jiǎn)單的文本格式記錄內(nèi)容。自從 MySQL增加了binlog功能之后, 就很少使用更新日志了。從版本5.0 開(kāi)始,MySQL 已經(jīng)不再支持更新日志了。
導(dǎo)入導(dǎo)出MySQL數(shù)據(jù)庫(kù)的方法
1. 概述
MySQL數(shù)據(jù)庫(kù)的導(dǎo)入,有兩種方法:
1) 先導(dǎo)出數(shù)據(jù)庫(kù)SQL腳本,再導(dǎo)入;
2) 直接拷貝數(shù)據(jù)庫(kù)目錄和文件。
在不同操作系統(tǒng)或MySQL版本情況下,直接拷貝文件的方法可能會(huì)有不兼容的情況發(fā)生。
所以一般推薦用SQL腳本形式導(dǎo)入。下面分別介紹兩種方法。
2. 方法一 SQL腳本形式
操作步驟如下:
2.1. 導(dǎo)出SQL腳本
在原數(shù)據(jù)庫(kù)服務(wù)器上,可以用phpMyAdmin工具,或者mysqldump(mysqldump命令位于mysql/bin/目錄中)命令行,導(dǎo)出SQL腳本。
2.1.1 用phpMyAdmin工具
導(dǎo)出選項(xiàng)中,選擇導(dǎo)出“結(jié)構(gòu)”和“數(shù)據(jù)”,不要添加“Drop DATABASE”和“Drop TABLE”選項(xiàng)。
選中“另存為文件”選項(xiàng),如果數(shù)據(jù)比較多,可以選中“gzipped”選項(xiàng)。
將導(dǎo)出的SQL文件保存下來(lái)。
2.1.2 用mysqldump命令行
命令格式
mysqldump -u用戶(hù)名 -p 數(shù)據(jù)庫(kù)名 > 數(shù)據(jù)庫(kù)名.sql
范例:
mysqldump -uroot -p abc > abc.sql
(導(dǎo)出數(shù)據(jù)庫(kù)abc到abc.sql文件)
提示輸入密碼時(shí),輸入該數(shù)據(jù)庫(kù)用戶(hù)名的密碼。
2.2. 創(chuàng)建空的數(shù)據(jù)庫(kù)
通過(guò)主控界面/控制面板,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。假設(shè)數(shù)據(jù)庫(kù)名為abc,數(shù)據(jù)庫(kù)全權(quán)用戶(hù)為abc_f。
2.3. 將SQL腳本導(dǎo)入執(zhí)行
同樣是兩種方法,一種用phpMyAdmin(mysql數(shù)據(jù)庫(kù)管理)工具,或者mysql命令行。
2.3.1 用phpMyAdmin工具
從控制面板,選擇創(chuàng)建的空數(shù)據(jù)庫(kù),點(diǎn)“管理”,進(jìn)入管理工具頁(yè)面。
3 方法二 直接拷貝
如果數(shù)據(jù)庫(kù)比較大,可以考慮用直接拷貝的方法,但不同版本和操作系統(tǒng)之間可能不兼容,要慎用。
3.1 準(zhǔn)備原始文件
用tar打包為一個(gè)文件
3.2 創(chuàng)建空數(shù)據(jù)庫(kù)
3.3 解壓
在臨時(shí)目錄中解壓,如:
cd /tmp
tar zxf mydb.tar.gz
3.4 拷貝
將解壓后的數(shù)據(jù)庫(kù)文件拷貝到相關(guān)目錄