From: Mattias Jonsson Date: July 8 2010 11:09pm Subject: bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3470) Bug#52455 List-Archive: http://lists.mysql.com/commits/113190 X-Bug: 52455 Message-Id: <201007082310.o68JVuaS024702@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6696189439838807033==" --===============6696189439838807033== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/b52455-51-bt/ based on revid:li-bing.song@stripped 3470 Mattias Jonsson 2010-07-09 Bug#52455: Subpar INSERT ON DUPLICATE KEY UPDATE performance with many partitions The handler function for reading one row from a specific index was not optimized in the partitioning handler since it used the default implementation. No test case since it is performance only, verified by hand. @ sql/ha_partition.cc Implemented a optimized version of index_read_idx_map for the case when find flag == HA_READ_KEY_EXACT, which is the common case. @ sql/ha_partition.h Declared ha_partition::index_read_idx_map modified: sql/ha_partition.cc sql/ha_partition.h === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2010-05-25 13:41:00 +0000 +++ b/sql/ha_partition.cc 2010-07-08 23:09:31 +0000 @@ -4220,6 +4220,58 @@ int ha_partition::index_read_last_map(uc /* + Optimization of the default implementation to take advantage of dynamic + partition pruning. +*/ +int ha_partition::index_read_idx_map(uchar *buf, uint index, + const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag) +{ + int error= HA_ERR_KEY_NOT_FOUND; + DBUG_ENTER("ha_partition::index_read_idx_map"); + + if (find_flag == HA_READ_KEY_EXACT) + { + uint part; + m_start_key.key= key; + m_start_key.keypart_map= keypart_map; + m_start_key.flag= find_flag; + m_start_key.length= calculate_key_len(table, index, m_start_key.key, + m_start_key.keypart_map); + + get_partition_set(table, buf, index, &m_start_key, &m_part_spec); + + /* How can it be more than one partition with the current use? */ + DBUG_ASSERT(m_part_spec.start_part == m_part_spec.end_part); + + for (part= m_part_spec.start_part; part <= m_part_spec.end_part; part++) + { + if (bitmap_is_set(&(m_part_info->used_partitions), part)) + { + error= m_file[part]->index_read_idx_map(buf, index, key, + keypart_map, find_flag); + if (error != HA_ERR_KEY_NOT_FOUND && + error != HA_ERR_END_OF_FILE) + break; + } + } + } + else + { + /* + If not only used with READ_EXACT, we should investigate if possible + to optimize for other find_flag's as well. + */ + DBUG_ASSERT(0); + /* fall back on the default implementation */ + error= handler::index_read_idx_map(buf, index, key, keypart_map, find_flag); + } + DBUG_RETURN(error); +} + + +/* Read next record in a forward index scan SYNOPSIS === modified file 'sql/ha_partition.h' --- a/sql/ha_partition.h 2009-11-17 19:02:16 +0000 +++ b/sql/ha_partition.h 2010-07-08 23:09:31 +0000 @@ -448,6 +448,15 @@ public: virtual int index_init(uint idx, bool sorted); virtual int index_end(); + /** + @breif + Positions an index cursor to the index specified in the hanlde. Fetches the + row if available. If the key value is null, begin at first key of the + index. + */ + virtual int index_read_idx_map(uchar *buf, uint index, const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag); /* These methods are used to jump to next or previous entry in the index scan. There are also methods to jump to first and last entry. --===============6696189439838807033== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mattias.jonsson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mattias.jonsson@stripped\ # fn32gvzw926trna9 # target_branch: file:///Users/mattiasj/mysql-bzr/b52455-51-bt/ # testament_sha1: b05be01bd4375916f753646b6848e5bee4361a26 # timestamp: 2010-07-09 01:09:42 +0200 # base_revision_id: li-bing.song@stripped\ # d51ifd6d0u4vca0v # # Begin bundle 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 KXH0AX7xiz4RoEP+LuSKcKEgLWqx7g== --===============6696189439838807033==--