mysql pdo 获取最后一条sql_一条SQL如何在MYSQL中执行的
mysql主要分為Server層和存儲引擎層
Server層:主要包括連接器、查詢緩存、分析器、優化器、執行器等;所有跨引擎的功能都包含在這里面,如存儲過程、觸發器、視圖、函數及通用日志模板binglog日志模塊。
存儲引擎層:負責數據的存儲及讀取,采用拔插式架構。目前默認InnoDB引擎。
server層主要包括
連接器:身份認證(登錄mysql用);
查詢緩存:執行查詢語句的時候,會先執行查詢緩存(在新的8.0版本已經被移除);
分析器:沒有命中緩存的話,SQL語句會經過分析器,分析器會先檢查sql詞法分析提取關鍵字,然后再語法分析是否正確;
優化器:mysql認為最優方案執行;
執行器:執行sql,并從存儲引擎返回數據。
查詢語句分析
select * from person where age = 18 and name ='flink';
先檢查該語句是否有權限,如果沒有權限,直接返回錯誤。若有權限8.0版本前會先查詢緩存;
第二步通過分析器進行詞法分析,獲取sql語句關鍵字,如上語句的select,提取需要查詢的表person,需要查詢所有列,查詢條件age=18 , 然后判斷這個語句是否有語法錯誤;
接下來是優化器進行確定執行方案,優化器會根據自己的優化算法選擇一個最優方案執行。如果是先查出age=18,然后判斷name='flink';還是先查詢name='flink',還是再查詢age=18;
最后進行權限校驗,并返回引擎的執行結果。
更新語句分析
update person set age=20 where name='flink';
先查詢到這條數據;
然后拿到查詢語句,把age改成20,然后調用引擎API,寫入這一行數據,InnoDB引擎把數據保存在內存中,同時記錄redo log 且 這時redo log馬上進入prepare狀態,然后告訴執行器,執行完成可以提交。
執行器收到通知后記錄binlog,然后調用引擎接口,提交redo log為提交狀態。
完成更新。
為什么有2個日志模塊
由于最初mysql并沒有InnoDB引擎,后來收購后以插件方式加入mysql中,redo log是InnoDB獨有的能保證數據庫異常后之前提交的記錄不丟失,mysql自帶的binlog日志只用來歸檔。
redo log與binlog這2個日志模塊如何分工協作
mysql在處理過程中保證數據完整性:
先判斷redo log中數據是否完整,如果判斷完整,就立即提交。
如果redo log只是預提交但是不是commit狀態,這個時候就去判斷binlog是否完整,如果也是完整的就會提交redo log,如果不完整就會執行回滾事務。
如上可以解決數據一致性問題。
總結
以上是生活随笔為你收集整理的mysql pdo 获取最后一条sql_一条SQL如何在MYSQL中执行的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql存储加速_mysql存储过程加
- 下一篇: 项目启动时socket自动启动_spri