2 3 mysql儲存 CSV插入資料

2021-10-23 19:26:00 字數 1834 閱讀 3344

上一節,我們大致過了一些mysql儲存引擎為csv型別的table檔案是如何儲存的。那麼這一節,我們來看看一條insert語句是如何執行的,並且落到csv檔案中的。看了很多現在網上的原始碼分析,都是發現5.x與8.0**上差距還是挺大的。

mysql>

insert

into user1 values(1

,'aaa'

,'bbb'

);

上一節大致我們提到,mysql是如何監聽sql_com的,所有的入口都是在do_command

>per_thread_connection_handler::add_connection

|>handle_connection||

>do_command||

|>dispatch_command||

||>mysql_parse||

|||>mysql_execute_command||

||||

>lex->m_sql_cmd->execute

insert語句就是sqlcom_insert

case sqlcom_insert:

case sqlcom_replace_select:

case sqlcom_insert_select:

case sqlcom_delete:

case sqlcom_delete_multi:

case sqlcom_update:

case sqlcom_update_multi:

case sqlcom_create_table:

case sqlcom_create_index:

case sqlcom_drop_index:

case sqlcom_assign_to_keycache:

case sqlcom_preload_keys:

case sqlcom_load:

傳入的物件是thd,我們所說的資料庫的連線就是這個物件,每乙個連線就是乙個thd物件,裡面的內容包含比較多,個人覺得在這裡展開去說沒有什麼意義,沒有我們會慢慢的去使用這塊。

到了這裡,是各種的解析器,以及讓讓人比較費解的設計模式,可讀性不是特別強。因此我們還是像上一節一樣從儲存落地開始分析。從上一節我們支援,csv對應的儲存引擎的操作都是在ha_tina.cc

>write_record

|>handler::ha_write_row||

>ha_tina::write_row

到這裡就比較明確的,insert對應的值是在這裡寫入的,但是這裡再往上,相對於之前的老版本就有了比較明顯的差距了。

先要看看對應的cmd是怎麼去構造的。

>mysql_parse

|>parse_sql||

>thd::sql_parser||

|>sql_yacc::mysqlparse #構建parse_tree_root物件||

|>lex::make_sql_cmd ||

||>pt_insert::make_cmd||

|||>new (thd->mem_root) sql_cmd_insert_values

mysqlparse這段**看起來相對比較晦澀。大致的邏輯就是,根據解析出來的sql選擇對應的觸發器。

到這裡,差不多已經了解了csv儲存引擎,insert一條資料的最主要的流程。

記住這裡只是乙個主流程,由於csv基本上是不能在簡單的儲存結構,對應的事務、索引等等都沒有涉及。到這裡差不多mysql的**執行結構也了解的一些了,不過還差很多。

23 MySQL基礎之應用優化

對於訪問資料庫來說,建立連線的代價比較昂貴,因此,可以通過建立 連線池 提高訪問的效能。連線池 把連線當做物件或者裝置,統一放在乙個 池子 中,以前需要直接訪問資料庫的地方,現在都改為從這個 池子 裡面獲取連線來使用。因為 池子 中的連線都已經預先建立好,可以直接分配給應用使用,因此大大減少了建立新...

15 23資料庫(23) MySQL事務

備註 所有查詢基於前面章節建立的校園資料庫 事務tranaction tx 開啟事務 begin 課程表插入 把妹 學科 insert into course name values 教師表插入一位把妹名師 insert into teacher name,gender,courseid value...

23 MySQL是怎麼保證資料不丟的?

只要保證redo log和binlog持久化到磁碟,就能確保mysql異常重啟後資料可以恢復。binlog的寫入邏輯比較簡單 事務執行過程中,先把日誌寫到binlog cache,事務提交的時候,再把binlog cache寫到binlog檔案中。系統給binlog cache分配了一片記憶體,每個...