mysql優(yōu)化

看書及博客總結(jié)的經(jīng)驗一直寫再本子上,現(xiàn)在放到網(wǎng)上用于自己學(xué)習(xí)使用,如果你看到有問題話請及時跟我反饋。


sql的優(yōu)化:

(大批量提交事務(wù)的時候)

1.插入數(shù)據(jù),按照主鍵的順序插入

2.關(guān)閉唯一性校驗(unique-check)

3.手動提交事務(wù)(set autocommit = 0)

優(yōu)化insert:

1.多條insert語句變成單條插入

2.事務(wù)提交變?yōu)槭謩犹峤?/p>

3.主鍵按照順序插入(b+樹)

優(yōu)化order by

1.使用覆蓋索引,2.按照索引的順序,3.跟多個條件要么都是升序要么都是降序

優(yōu)化group by:

group by會自動調(diào)用order by,如果不想排序,最后加上order by null

嵌套查詢:采用多表聯(lián)查的方式來替代子查詢

優(yōu)化or?

1.or最好不用復(fù)合索引(前后索引條件中必須都要符合最左前綴匹配)、

2.用union替換or

優(yōu)化分頁查詢:

比如你寫一個sql語句,select * from zhang where fan = ‘1’ limit (20000,1);會發(fā)現(xiàn)limit語句隨著后面的數(shù)據(jù)隨著數(shù)量的變大耗時變成,比如limit(20,10)的時間就會遠小于limit(20000,1),因為limit會對前面的數(shù)據(jù)進行排序操作所以耗時,

解決方案:根據(jù)索引完成排序,然后根據(jù)主鍵關(guān)聯(lián)查詢數(shù)據(jù);

1:例如:select * from tb t (select id from tbl order by id limit (2000,10)) a? where t.id = a.id?

2:還有中方法是只要找到相應(yīng)的位置直接往后查詢,例如:select * from tbl where id >20000 limit 10;? 注:但是這種情況必須是主鍵自增列,并且不能出現(xiàn)斷層的情況,如果出現(xiàn)斷層的情況會出現(xiàn)查詢數(shù)據(jù)不準確;

sql語句索引可以主動添加提示:

1.use index :例:select * from 。。。。。 use index () where name = ‘’;(建議數(shù)據(jù)庫使用某種索引)

2.ingre index :與上面的情況相反

3.force index :強制數(shù)據(jù)庫使用某種索引


應(yīng)用程序的優(yōu)化

1.使用數(shù)據(jù)庫鏈接池,防止頻繁的創(chuàng)建與關(guān)閉鏈接消耗資源

2.避免無效訪問

3.使用緩存:如mybatis的的一二級緩存與redis的緩存

4.使用負載均衡的方式:使用讀寫分離的方式

master用于接收client的寫請求,將數(shù)據(jù)同步給slave,客戶端可以從slave進行數(shù)據(jù)讀取但是不能寫及更改數(shù)據(jù)

mysql進行數(shù)據(jù)處理的流程圖:



mysql數(shù)據(jù)查詢流程圖


mysql并發(fā)參數(shù)調(diào)整

參數(shù):max_connections(默認最大鏈接數(shù))

back_log:擠壓請求棧的大小,較短時間內(nèi)處理很多請求,請求可以放到棧中

table_open_cache:表緩存

thread_cache_size:線程緩存大小,緩存一定數(shù)量的客戶服務(wù)線程用以備用

innodb_lock_wait_timeout : innodb 事務(wù)行鎖執(zhí)行的等待時間,如果沒有搶到鎖直接返回,默認等待時間是50ms

mysql中的鎖

分類:

{表鎖:粒度大,并發(fā)低,不會死鎖

行鎖:開銷大,粒度小,沖突小,會有死鎖}

操作的分類:

{共享鎖/排他鎖}

mysiam(表鎖):1.某一線程持有讀鎖會阻塞其他線程的寫操作,不會影響讀操作 || 2.持有寫鎖的時候,其他的寫鎖讀鎖都不能執(zhí)行

? ? 讀寫鎖之間的調(diào)度是寫鎖優(yōu)先,不僅如此,即使讀請求先到鎖等待隊列,寫請求后到,寫鎖也會插到讀鎖請求之前!這是因為MySQL認為 寫請求一般比讀請求要重要。這也正是MyISAM表不太適合于有大量更新操作和查詢操作應(yīng)用的原因,因為,大量的更新操作會造成查詢操作很難獲得讀鎖,從 而可能永遠阻塞。

innodb:(行鎖):開銷大,加鎖慢,死鎖

? ? 一個概念行級鎖升級為表級鎖,當我們的索引失效的情況下如(索引是varchar類型但是索引條件沒有加‘’),mysql會把整張表鎖住,

? ? 有一個間隙鎖的概念,比如我們數(shù)據(jù)有1.2.3.4.6.7.8.9,沒有5這條數(shù)據(jù),然后我們查詢語句是id<10.這個時候我們不commit ,然后我們對5進行操作,比如我insert into tb zhan? = fan? where id = 5;這個時候就會被卡住,這個就是間隙鎖,innodb會自動對間隙進行加鎖。

優(yōu)化建議:

1.讓所有的數(shù)據(jù)索引完成,避免無效的索引,導(dǎo)致行鎖升級為表鎖

2.合理設(shè)計索引,盡量縮小鎖范圍

3.盡量減少索引的條件,避免間隙鎖的產(chǎn)生

4.控制事務(wù)的大小,減小鎖定的資源量和時間長度

5.使用低級別的事務(wù)隔離(讀未提交,讀已提交,可重復(fù)讀,串行讀)

mysql日志:(待補充)

錯誤日志:show tables like “l(fā)og_errors%”

二進制日志:ddl(數(shù)據(jù)定義語言) dml(數(shù)據(jù)操作語言)

? ? ? ? ? ? ? ? ? ? ? 日志格式:1.statement:sql語句用于主從復(fù)制,日志解析原文本,從庫重新執(zhí)行

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?row:所有行數(shù)據(jù)變化

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mixed:默認格式

慢查詢?nèi)罩荆?/p>

long_query_time :10s超過10s的數(shù)據(jù)語句

slow_query_log = 1 開啟

slow_query_log_file = slow_query.log :慢日志的存儲位置

mysql的主從復(fù)制



mysiam和innodb區(qū)別

innodb:事務(wù) 外鍵 行級鎖 聚簇索引

mysiam:InnoDB不支持全文索引,而MyISAM支持。全文索引是指對char、varchar和text中的每個詞(停用詞除外)建立倒排序索引。
沒有where的count(*)使用MyISAM要比InnoDB快得多。因為MyISAM內(nèi)置了一個計數(shù)器,count(*)時它直接從計數(shù)器中讀,而InnoDB必須掃描全表。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)??梢源蟠蟮奶嵘覀僑...
    寵辱不驚丶歲月靜好閱讀 2,633評論 1 8
  • SQL優(yōu)化 -- 通過show status命令了解各種sql的執(zhí)行效率 查看本session的sql執(zhí)行效率sh...
    歡喜的看著書閱讀 400評論 0 0
  • 備注:測試數(shù)據(jù)庫版本為MySQL 8.0 一. 內(nèi)部鎖定方法 本節(jié)討論內(nèi)部鎖定;也就是說,在MySQL服務(wù)器內(nèi)部執(zhí)...
    只是甲閱讀 465評論 0 0
  • 原文鏈接:http://blog.csdn.net/qq_22329521/article/details/548...
    越長越圓閱讀 6,378評論 0 22
  • 一、索引 1. 索引是什么? 定義索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)??梢缘玫剿饕谋举|(zhì):索引是數(shù)據(jù)結(jié)構(gòu)可...
    houxin閱讀 782評論 0 7

友情鏈接更多精彩內(nèi)容