看書及博客總結(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.使用負載均衡的方式:使用讀寫分離的方式

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必須掃描全表。