MySQL 在崩潰恢復(fù)時,會遍歷打開所有 ibd 文件的 header page 驗(yàn)證數(shù)據(jù)字典的準(zhǔn)確性,如果 MySQL 中包含了大量表,這個校驗(yàn)過程就會比較耗時。 MySQL 下崩潰恢復(fù)確實(shí)和表數(shù)量有關(guān),表總數(shù)越大,崩潰恢復(fù)時間越長。另外磁盤 IOPS 也會影響崩潰恢復(fù)時間,像這里開發(fā)庫的 HDD IOPS 較低,因此面對大量的表空間,校驗(yàn)速度就非常緩慢。另外一個發(fā)現(xiàn),MySQL 8 下正常啟用時居然也會進(jìn)行表空間校驗(yàn),而故障恢復(fù)時則會額外再進(jìn)行一次表空間校驗(yàn),等于校驗(yàn)了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數(shù)量超過 5W 時,會啟用多線程掃描,加快表空間校驗(yàn)過程。
10年積累的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有亳州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
如何跳過校驗(yàn)MySQL 5.7 下有方法可以跳過崩潰恢復(fù)時的表空間校驗(yàn)過程嘛?查閱了資料,方法主要有兩種:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳過表空間校驗(yàn)。實(shí)際測試的時候設(shè)置 innodb_force_recovery =1,也就是強(qiáng)制恢復(fù)跳過壞頁,就可以跳過校驗(yàn),然后重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復(fù)后非常耗時的表空間校驗(yàn)過程,快速啟動 MySQL,個人目前暫時未發(fā)現(xiàn)有什么隱患。2. 使用共享表空間替代獨(dú)立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節(jié)省了校驗(yàn)時間。自從聽了姜老師講過使用共享表空間替代獨(dú)立表空間解決 drop 大表時性能抖動的原理后,感覺共享表空間在很多業(yè)務(wù)環(huán)境下,反而更有優(yōu)勢。
臨時冒出另外一種解決想法,即用 GDB 調(diào)試崩潰恢復(fù),通過臨時修改 validate 變量值讓 MySQL 跳過表空間驗(yàn)證過程,然后讓 MySQL 正常關(guān)閉,重新啟動就可以正常啟動了。但是實(shí)際測試發(fā)現(xiàn),如果以 debug 模式運(yùn)行,確實(shí)可以臨時修改 validate 變量,跳過表空間驗(yàn)證過程,但是 debug 模式下代碼運(yùn)行效率大打折扣,反而耗時更長。而以非 debug 模式運(yùn)行,則無法修改 validate 變量,想法破滅。
索引是快速搜索的關(guān)鍵。MySQL索引的建立對于mysql的高效運(yùn)行是很重要的。下面幾種常見的MySQL索引類型。
在數(shù)據(jù)庫表中,對字段建立索引可以大大提高查詢速度。假如我們創(chuàng)建了一個 mytable表:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 我們隨機(jī)向里面插入了10000條記錄,其中有一條:5555,admin。
在查找username="admin"的記錄 SELECT * FROMmytable WHERE username='admin';時,如果在username上已經(jīng)建立了索引,MySQL無須任何掃描,即準(zhǔn)確可找到該記錄。相反,MySQL會掃描所有記錄,即要查詢10000條記錄。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
MySQL索引類型包括:
(1)普通索引
這是最基本的索引,它沒有任何限制。它有以下幾種創(chuàng)建方式:
◆創(chuàng)建索引
CREATE INDEX indexName ONmytable(username(length)); 如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長度;如果是BLOB和TEXT類型,必須指定 length,下同。
◆修改表結(jié)構(gòu)
ALTER mytable ADD INDEX [indexName] ON(username(length)) ◆創(chuàng)建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 刪除索引的語法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:
◆創(chuàng)建索引
CREATE UNIQUE INDEX indexName ONmytable(username(length)) ◆修改表結(jié)構(gòu)
ALTER mytable ADD UNIQUE [indexName] ON(username(length)) ◆創(chuàng)建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
(3)主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); 當(dāng)然也可以用 ALTER 命令。記?。阂粋€表只能有一個主鍵。
(4)組合索引
為了形象地對比單列索引和組合索引,為表添加多個字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL ); 為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。就是將 name, city, age建到一個索引里:
ALTER TABLE mytable ADD INDEX name_city_age(name(10),city,age); 建表時,usernname長度為 16,這里用 10。這是因?yàn)橐话闱闆r下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引文件的大小,提高INSERT的更新速度。
MySQL 在崩潰恢復(fù)時,會遍歷打開所有 ibd 文件的 header page 驗(yàn)證數(shù)據(jù)字典的準(zhǔn)確性,如果 MySQL 中包含了大量表,這個校驗(yàn)過程就會比較耗時。 MySQL 下崩潰恢復(fù)確實(shí)和表數(shù)量有關(guān),表總數(shù)越大,崩潰恢復(fù)時間越長。另外磁盤 IOPS 也會影響崩潰恢復(fù)時間,像這里開發(fā)庫的 HDD IOPS 較低,因此面對大量的表空間,校驗(yàn)速度就非常緩慢。另外一個發(fā)現(xiàn),MySQL 8 下正常啟用時居然也會進(jìn)行表空間校驗(yàn),而故障恢復(fù)時則會額外再進(jìn)行一次表空間校驗(yàn),等于校驗(yàn)了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數(shù)量超過 5W 時,會啟用多線程掃描,加快表空間校驗(yàn)過程。
如何跳過校驗(yàn)MySQL 5.7 下有方法可以跳過崩潰恢復(fù)時的表空間校驗(yàn)過程嘛?查閱了資料,方法主要有兩種:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳過表空間校驗(yàn)。實(shí)際測試的時候設(shè)置 innodb_force_recovery =1,也就是強(qiáng)制恢復(fù)跳過壞頁,就可以跳過校驗(yàn),然后重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復(fù)后非常耗時的表空間校驗(yàn)過程,快速啟動 MySQL,個人目前暫時未發(fā)現(xiàn)有什么隱患。2. 使用共享表空間替代獨(dú)立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節(jié)省了校驗(yàn)時間。自從聽了姜老師講過使用共享表空間替代獨(dú)立表空間解決 drop 大表時性能抖動的原理后,感覺共享表空間在很多業(yè)務(wù)環(huán)境下,反而更有優(yōu)勢。
臨時冒出另外一種解決想法,即用 GDB 調(diào)試崩潰恢復(fù),通過臨時修改 validate 變量值讓 MySQL 跳過表空間驗(yàn)證過程,然后讓 MySQL 正常關(guān)閉,重新啟動就可以正常啟動了。但是實(shí)際測試發(fā)現(xiàn),如果以 debug 模式運(yùn)行,確實(shí)可以臨時修改 validate 變量,跳過表空間驗(yàn)證過程,但是 debug 模式下代碼運(yùn)行效率大打折扣,反而耗時更長。而以非 debug 模式運(yùn)行,則無法修改 validate 變量,想法破滅。
更改mysql配置如下:
#
Uncomment
the
following
if
you
are
using
InnoDB
tables
#innodb_data_home_dir
=
/var/lib/mysql/
innodb_data_file_path
=
ibdata1:50M:autoextend
#innodb_log_group_home_dir
=
/var/lib/mysql/
#innodb_log_arch_dir
=
/var/lib/mysql/
#
You
can
set
.._buffer_pool_size
up
to
50
-
80
%
#
of
RAM
but
beware
of
setting
memory
usage
too
high
innodb_buffer_pool_size
=
256M
innodb_additional_mem_pool_size
=
10M
#
Set
.._log_file_size
to
25
%
of
buffer
pool
size
#innodb_log_file_size
=
128M
innodb_log_buffer_size
=
8M
#innodb_flush_log_at_trx_commit
=
1
#innodb_lock_wait_timeout
=
50
innodb_support_xa=off
用mysql-connector-odbc-5[1].1.5-win32.msi這個驅(qū)動程序
哥們,你建主鍵了沒?
排除了以上問題,還慢,就看看你的連接了,如果是自己寫的,那么建議你找個別人寫好的連接類試試。有時候代碼沒問題,db沒問題,那么只有時連接的問題了!!
希望對你有用。
網(wǎng)頁題目:mysql更新慢怎么解決 mysql 更新性能
文章路徑:http://m.rwnh.cn/article40/dosgoho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名、自適應(yīng)網(wǎng)站、ChatGPT、用戶體驗(yàn)、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)