tc_acquire_table and tc_release_table are critical sections of table cache. Among other things, they update TABLE_SHARE::tdc.used_tables:
tc_acquire_table - push new TABLE object to used_tables
tc_release_table - remove TABLE object from used_tables
used_tables list is not really necessary for table cache to operate properly. We can change it with all_tables list instead. tc_acquire_table and tc_release_table wont need to access all_tables list at all.
The cost is as following:
- 2 additional pointers per TABLE object
- SHOW OPEN TABLES will have to iterate all_tables and skip objects with in_use == 0
- same for TABLE_SHARE::visit_subgraph()
- same for kill_delayed_threads_for_table()
A patch for this task has been tested (read-only single table OLTP, 4 CPU linux server) and shown ~30% lower LOCK_open wait time and ~20% higher tps.