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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- MySQL事務(二)事務隔離的實現原理:一致性讀MySql
- 解讀GaussDB(for MySQL)靈活多維的二級分割槽表策略MySql
- MySQL的可重複讀級別能解決幻讀嗎MySql
- MySQL探祕(六):InnoDB一致性非鎖定讀MySql
- 解讀MySQL雙主複製的主備資料一致性GPMySql
- MYSQL——mysql檢索不包含字母U的資料MySql
- MySQL單表檢索MySql
- MySQL半一致性讀原理解析-從原始碼角度解析MySql原始碼
- MySQL 之隔離級別:可重複讀MySql
- MySQL-檢索資料MySql
- MySQL與Redis實現二級快取MySqlRedis快取
- 美團二面:Redis與MySQL雙寫一致性如何保證?RedisMySql
- 科研基本功——高效文獻檢索與文獻閱讀保姆級教程
- Oracle一致性讀(Consistent Read)的原理Oracle
- MySQL8.0.27 新特性-提高二級索引的建立效率MySql索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- MySQL資料一致性MySql
- 線索二叉樹的原理及建立二叉樹
- 13、線索二叉樹二叉樹
- DMA cache一致性二
- mysql的升級MySql
- MySQL隔離級別解析:資料一致性與高併發之間的平衡術!MySql
- 讀寫一致性的一些思考
- 【高階RAG技巧】使用二階段檢索器平衡檢索的效率和精度
- Oracle一致性讀(consistents gets)Oracle
- rocketmq可靠一致性的mysql落地實現MQMySql
- MySQL事務一致性理解MySql
- mysql資料一致性解析MySql
- 關於MySQL InnoDB表的二級索引是否加入主鍵的總結MySql索引
- 線索二叉樹【定義、應用、線索化、遍歷】二叉樹
- 基於LINUX的MySql二進位制本地升級實施文件LinuxMySql
- mysql 5.6 升級 到 5.7 的二進位制升級方法 另一個簡便思路.MySql
- 如何優化MySQL千萬級大表,我寫了6000字的解讀優化MySql
- jq+php+mysql 實現二級選單聯動PHPMySql
- DashVector + DashScope升級多模態檢索
- 線索二叉樹的構造和遍歷二叉樹
- MySQL的分割槽(二)MySql