MySQL 在崩潰恢復時,會遍歷打開所有 ibd 文件的 header page 驗證數(shù)據(jù)字典的準確性,如果 MySQL 中包含了大量表,這個校驗過程就會比較耗時。 MySQL 下崩潰恢復確實和表數(shù)量有關(guān),表總數(shù)越大,崩潰恢復時間越長。另外磁盤 IOPS 也會影響崩潰恢復時間,像這里開發(fā)庫的 HDD IOPS 較低,因此面對大量的表空間,校驗速度就非常緩慢。另外一個發(fā)現(xiàn),MySQL 8 下正常啟用時居然也會進行表空間校驗,而故障恢復時則會額外再進行一次表空間校驗,等于校驗了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數(shù)量超過 5W 時,會啟用多線程掃描,加快表空間校驗過程。
成都創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元延平做網(wǎng)站,已為上家服務,為延平各地企業(yè)和個人服務,聯(lián)系電話:028-86922220
如何跳過校驗MySQL 5.7 下有方法可以跳過崩潰恢復時的表空間校驗過程嘛?查閱了資料,方法主要有兩種:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳過表空間校驗。實際測試的時候設置 innodb_force_recovery =1,也就是強制恢復跳過壞頁,就可以跳過校驗,然后重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復后非常耗時的表空間校驗過程,快速啟動 MySQL,個人目前暫時未發(fā)現(xiàn)有什么隱患。2. 使用共享表空間替代獨立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節(jié)省了校驗時間。自從聽了姜老師講過使用共享表空間替代獨立表空間解決 drop 大表時性能抖動的原理后,感覺共享表空間在很多業(yè)務環(huán)境下,反而更有優(yōu)勢。
臨時冒出另外一種解決想法,即用 GDB 調(diào)試崩潰恢復,通過臨時修改 validate 變量值讓 MySQL 跳過表空間驗證過程,然后讓 MySQL 正常關(guān)閉,重新啟動就可以正常啟動了。但是實際測試發(fā)現(xiàn),如果以 debug 模式運行,確實可以臨時修改 validate 變量,跳過表空間驗證過程,但是 debug 模式下代碼運行效率大打折扣,反而耗時更長。而以非 debug 模式運行,則無法修改 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沒問題,那么只有時連接的問題了。
如果原表很大,插入數(shù)據(jù)會非常慢,建議插入到臨時表,然后用一個語句(INSERT
INTO
XXX
SELECT
*
FTOM
TMPXXX)把數(shù)據(jù)插入,這樣速度會快一點,如果想更快,需要減少不必要的索引,如果大批量的插入,可以插入前刪除索引,插入后重新建立。
你好,很高興回答你的問題。
要解答這個問題,首先要了解數(shù)據(jù)表結(jié)構(gòu),自己表的索引情況,還有現(xiàn)有的數(shù)據(jù)量等等。
然后才能根據(jù)情況來分析到底是什么原因?qū)е碌膶懭胨俣嚷?/p>
mysql5的手冊中提到,插入一條記錄,所需的時間比例大概是:
連接:(3)
發(fā)送查詢給服務器:(2)
分析查詢:(2)
插入記錄:(1x記錄大?。?/p>
插入索引:(1x索引)
關(guān)閉:(1)
并且表的大小以logN(B樹)的速度減慢索引的插入,因此提高插入速度的方法大概有以下7種:
一個insert語句包含多個value值;
使用insert delayed方法;
使用insert into ...values(select ...from),即select的同時執(zhí)行insert;
使用load data infile;
先禁掉索引,插入后再創(chuàng)建索引;
寫鎖表,插入,解鎖。原因是索引緩存區(qū)僅在所有insert語句完成后才刷新到磁盤上一次;
增加key_buffer_size值來擴大鍵高速緩沖區(qū)。
1.當我們請求mysql服務器的時候,MySQL前端會有一個監(jiān)聽,請求到了之后,服務器得到相關(guān)的SQL語句,執(zhí)行之前(虛線部分為執(zhí)行),還會做權(quán)限的判斷
2.通過權(quán)限之后,SQL就到MySQL內(nèi)部,他會在查詢緩存中,看該SQL有沒有執(zhí)行過,如果有查詢過,則把緩存結(jié)果返回,說明在MySQL內(nèi)部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數(shù)都要一樣,所以這個命中率是非常低的(沒什么卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結(jié)果,那么就到了解析器,解析器主要對SQL語法進行解析
4.解析結(jié)束后就變成一顆解析樹,這個解析樹其實在Hibernate里面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate里面有HQL,它就是通過這個工具轉(zhuǎn)換成SQL的,我們編程語言之所以有很多規(guī)范、語法,其實就是為了便于這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之后,不能馬上執(zhí)行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經(jīng)過任何優(yōu)化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什么地方,如果有計算的東西,把計算的結(jié)果算出來等等...
6.預處理完畢之后,此時得到一棵比較規(guī)范的樹,這棵樹就是要拿去馬上做執(zhí)行的樹,比起之前的那棵樹,這棵得到了一些優(yōu)化
7.查詢優(yōu)化器,是MySQL里面最關(guān)鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎么去執(zhí)行?它是先執(zhí)行username = toby還是password = 1?每一條SQL的執(zhí)行順序查詢優(yōu)化器就是根據(jù)MySQL對數(shù)據(jù)統(tǒng)計表的一些信息,比如索引,比如表一共有多少數(shù)據(jù),MySQL都是有緩存起來的,在真正執(zhí)行SQL之前,他會根據(jù)自己的這些數(shù)據(jù),進行一個綜合的判定,判斷這一次在多種執(zhí)行方式里面,到底選哪一種執(zhí)行方式,可能運行的最快.這一步是MySQL性能中,最關(guān)鍵的核心點,也是我們的優(yōu)化原則.我們平時所講的優(yōu)化SQL,其實說白了,就是想讓查詢優(yōu)化器,按照我們的想法,幫我們選擇最優(yōu)的執(zhí)行方案,因為我們比MySQL更懂我們的數(shù)據(jù).MySQL看數(shù)據(jù),僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據(jù)這些信息選了一個它自認為最優(yōu)的方案,但是這個方案可能和我們想象的不一樣.
8.這里的查詢執(zhí)行計劃,也就是MySQL查詢中的執(zhí)行計劃,比如要先執(zhí)行username = toby還是password = 1
9.這個執(zhí)行計劃會傳給查詢執(zhí)行引擎,執(zhí)行引擎選擇存儲引擎來執(zhí)行這一份傳過來的計劃,到磁盤中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什么?就是硬盤的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據(jù)這個時間的IO來確定的.那怎么執(zhí)行IO又是什么來確定的?就是傳過來的這一份執(zhí)行計劃.(優(yōu)化就是制定一個我們認為最快的執(zhí)行方案,最節(jié)省IO,和執(zhí)行最快)
10.如果開了查詢緩存,則返回結(jié)果給客戶端,并且查詢緩存也放一份。