1.一條查詢語句如何執(zhí)行?
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計、網(wǎng)站制作與策劃設(shè)計,費縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:費縣等地區(qū)。費縣做網(wǎng)站價格咨詢:13518219792
2.一條更新語句如何執(zhí)行?
3.innodb的redolog是什么?
4.什么是寫緩沖
5.寫緩沖一定好嗎?
6.什么情況會引發(fā)刷臟頁
關(guān)于一條mysql查詢語句在mysql中的執(zhí)行流程
如select name from test where id=10;
1.連接器---先與mysql服務(wù)端連接器建立連接,若查詢緩存命中則直接返回 (查詢緩存的弊端:查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。)
2.分析器---詞法分析告訴服務(wù)端你要干什么(我要找 test表中id為10的名字) ( 其中sql語法錯誤在這塊暴露 )
3.優(yōu)化器---服務(wù)端會思考該怎么執(zhí)行最優(yōu)(索引的選擇)
4.執(zhí)行器---檢查用戶對庫對表的權(quán)限
5.存儲引擎--存儲數(shù)據(jù),提供讀寫接口
以update a set name=1 where id=1;
主要區(qū)別在于在查詢到數(shù)據(jù)之后(select name from a where id=1),如果是innodb引擎它會進行日志的兩階段提交:
1.開啟事務(wù),寫入redolog(innodb引擎特有),并更新內(nèi)存
3.寫入binlog,提交事務(wù),commit
我們知道m(xù)ysql數(shù)據(jù)存儲包含內(nèi)存與磁盤兩個部分,innodb是按數(shù)據(jù)頁(通常為16k)從磁盤讀取到內(nèi)存中的(剩余操作在內(nèi)存中執(zhí)行),當要更新數(shù)據(jù)時,若目標數(shù)據(jù)的數(shù)據(jù)頁剛好在內(nèi)存中,則直接更新。不在呢?
將這個更新操作(也可能是插入) 緩存在change buffer中 (redolog也會記錄這個change buffer操作)等到下一次查詢要用到這些數(shù)據(jù)時,再執(zhí)行這些操作,改變數(shù)據(jù)(稱為合并操作記錄稱為merge)。
innodb_change_buffer_max_size
innodb_change_buffering
先介紹兩個概念
因為redolog是環(huán)形日志,當redolog寫滿時,就需要“擦掉”開頭的一部分數(shù)據(jù)來達到循環(huán)寫,這里的擦掉指,指將redolog日志的checkpoint位置從 CP推進到CP‘ ,同時將兩點之間的臟頁刷到磁盤上(flush操作),此時系統(tǒng)要停止所有的更新操作(防止更新操作丟失)
1.系統(tǒng)內(nèi)存不足。當要讀取新的內(nèi)存頁時就要淘汰一些數(shù)據(jù)頁,如果淘汰的正好是臟頁,就要執(zhí)行一次flush操作
2.Mysql認為系統(tǒng)處于“空閑狀態(tài)”
3.正常關(guān)閉Mysql
上述后兩者場景(系統(tǒng)空閑和正常關(guān)閉)對于性能都沒太大影響。
當為第一種redolog寫滿時,系統(tǒng)無法執(zhí)行更新操作,所有操作都會堵塞
當為第二種內(nèi)存不夠用時,如果淘汰臟頁太多,影響mysql響應(yīng)時間
后兩者刷臟頁會影響性能,所以Mysql需要有刷臟頁控制策略,可以從以下幾個設(shè)置項考慮
1.設(shè)置innodb_io_capacity告訴innodb所在主機的IO能力
ENGINE=InnoDB 是數(shù)據(jù)庫引擎,提供了事務(wù)控制能力功能。DEFAULT CHARSET=gbk 默認字符編碼為GBK都是一些建表的約束。
說明
resource mysql_query ( string query [, resource link_identifier])
mysql_query() 向與指定的連接標識符關(guān)聯(lián)的服務(wù)器中的當前活動數(shù)據(jù)庫發(fā)送一條查詢,如果沒有指定 link_identifier,則使用上一個打開的連接。如果沒有打開的連接,本函數(shù)會嘗試無參數(shù)調(diào)用?mysql_connect() 函數(shù)來建立一個連接并使用之。查詢結(jié)果會被緩存。
MYSQL沒有IF的語句,MYSQL使用的是MYSQL特色的SQL語句,它的WHERE和IF差不多,同樣的條件判斷 SELECT 字段 FROM 表名 where 條件