1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

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.
This commit is contained in:
Mattias Jonsson
2010-07-09 01:09:31 +02:00
parent b440125f1c
commit e13405a79f
2 changed files with 61 additions and 0 deletions

View File

@@ -4219,6 +4219,58 @@ int ha_partition::index_read_last_map(uchar *buf, const uchar *key,
}
/*
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

View File

@@ -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.