MySQL e二級索引上的一致性讀
二級索引上沒有rollpointer,所以只有當前版本,如果sql要透過二級索引查詢資料,在存在多版本的情況下,還是要回到cluster index上進行多版本的查詢。所以即使是select,效能也會出現不穩定的情況。
下面是程式碼中的例子:
create table t1(a int not null, b int, primary key(a), index(b));
insert into t1 values (1,1),(2,2);
commit;
sessin 1
select b from t1 where b >= 1;
session 2
update t1 set b = 5 where b = 2;
這樣不能透過只是掃描二級索引獲取結果了,還需要回表去查cluster index的歷史版本。
堆疊如下:在row_search_mvcc中可以看到針對二級索引查詢,是有判斷的,獲取二級索引頁上的max_trx_id 進行可見性的判斷。
mysqld!page_get_max_trx_id(unsigned char const*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/include/page0page.ic:80) mysqld!lock_sec_rec_cons_read_sees(unsigned char const*, dict_index_t const*, ReadView const*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/lock/lock0lock.cc:428) mysqld!row_search_mvcc(unsigned char*, page_cur_mode_t, row_prebuilt_t*, unsigned long, unsigned long) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/row/row0sel.cc:5673) mysqld!ha_innobase::general_fetch(unsigned char*, unsigned int, unsigned int) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/handler/ha_innodb.cc:9052) mysqld!ha_innobase::index_next(unsigned char*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/handler/ha_innodb.cc:9123) mysqld!handler::ha_index_next(unsigned char*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/handler.cc:3132) mysqld!join_read_next(READ_RECORD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_executor.cc:2676) mysqld!sub_select(JOIN*, QEP_TAB*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_executor.cc:1287) mysqld!do_select(JOIN*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_executor.cc:957) mysqld!JOIN::exec() (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_executor.cc:206) mysqld!handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_select.cc:191) mysqld!execute_sqlcom_select(THD*, TABLE_LIST*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:5155) mysqld!mysql_execute_command(THD*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:2826) mysqld!mysql_parse(THD*, Parser_state*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:5584) mysqld!dispatch_command(THD*, COM_DATA const*, enum_server_command) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1491) mysqld!do_command(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1032) mysqld!::handle_connection(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/conn_handler/connection_handler_per_thread.cc:313) mysqld!::pfs_spawn_thread(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/perfschema/pfs.cc:2197) libsystem_pthread.dylib!_pthread_start (Unknown Source:0) libsystem_pthread.dylib!thread_start (Unknown Source:0)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2916935/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql一致性讀MySql
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- coreseek,php,mysql全文檢索部署(二)PHPMySql
- MySQL事務(二)事務隔離的實現原理:一致性讀MySql
- 【MySQL】淺談一致性讀MySql
- MySQL半一致性讀導致語句級Binlog複製錯誤MySql
- 解讀GaussDB(for MySQL)靈活多維的二級分割槽表策略MySql
- MySQL的可重複讀級別能解決幻讀嗎MySql
- 線索二叉樹的線索化演算法二叉樹演算法
- 關於ORACLE MYSQL在非字首分割槽索引上分割槽剪裁的比較OracleMySql索引
- MySQL探祕(六):InnoDB一致性非鎖定讀MySql
- 【基礎篇一致性讀】一致性讀分析
- MySQL單表檢索MySql
- MYSQL——mysql檢索不包含字母U的資料MySql
- 【基礎篇一致性讀】一致性讀分析(三)
- 【基礎篇一致性讀】一致性讀分析(續)
- 【一致性讀的計算】
- 解讀MySQL雙主複製的主備資料一致性GPMySql
- 擊敗二分檢索演算法——插值檢索、快速檢索演算法
- MySQL 之隔離級別:可重複讀MySql
- MySQL半一致性讀原理解析-從原始碼角度解析MySql原始碼
- 科研基本功——高效文獻檢索與文獻閱讀保姆級教程
- 美團二面:Redis與MySQL雙寫一致性如何保證?RedisMySql
- MySQL與Redis實現二級快取MySqlRedis快取
- 13、線索二叉樹二叉樹
- 線索二叉樹的原理及建立二叉樹
- hibernate(八) Hibernate檢索策略(類級別,關聯級別,批量檢索)詳解
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- MySQL8.0.27 新特性-提高二級索引的建立效率MySql索引
- DMA cache一致性二
- 【筆記】線索二叉樹筆記二叉樹
- 二叉線索樹實現
- 線索二叉樹【定義、應用、線索化、遍歷】二叉樹
- MySQL資料一致性MySql
- 【高階RAG技巧】使用二階段檢索器平衡檢索的效率和精度
- coreseek,php,mysql全文檢索部署(一)PHPMySql
- 讀寫一致性的一些思考
- 由讀一致性分析undo