summaryrefslogtreecommitdiff
path: root/storage/federatedx
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2014-02-21 00:52:50 +0100
committerSergei Golubchik <sergii@pisem.net>2014-02-21 00:52:50 +0100
commite840d323e22b5737a8594c497209b7147154e912 (patch)
tree20b321b70871bcf56bcd5085e9d65f22ec8fd1b6 /storage/federatedx
parent62f355239007efc4546ea2d774ddb9ce1aa585f5 (diff)
downloadmariadb-git-e840d323e22b5737a8594c497209b7147154e912.tar.gz
MDEV-5698 Using ORDER BY in a FederatedX table is abnormally slow
In ::position() federated needs to know an element before the current ("data_cursor") in the single-linked list. Replace list traversal for every ::position() call (which is O(n^2)) with remembering the current element before it's advanced by mysql_fetch_row(). storage/federatedx/federatedx_io_mysql.cc: mdev:5698
Diffstat (limited to 'storage/federatedx')
-rw-r--r--storage/federatedx/federatedx_io_mysql.cc17
1 files changed, 5 insertions, 12 deletions
diff --git a/storage/federatedx/federatedx_io_mysql.cc b/storage/federatedx/federatedx_io_mysql.cc
index 8df54f9c6f2..c6a5732c564 100644
--- a/storage/federatedx/federatedx_io_mysql.cc
+++ b/storage/federatedx/federatedx_io_mysql.cc
@@ -62,6 +62,7 @@ struct mysql_position
class federatedx_io_mysql :public federatedx_io
{
MYSQL mysql; /* MySQL connection */
+ MYSQL_ROWS *current;
DYNAMIC_ARRAY savepoints;
bool requested_autocommit;
bool actual_autocommit;
@@ -510,7 +511,9 @@ my_ulonglong federatedx_io_mysql::get_num_rows(FEDERATEDX_IO_RESULT *io_result)
FEDERATEDX_IO_ROW *federatedx_io_mysql::fetch_row(FEDERATEDX_IO_RESULT *io_result)
{
- return (FEDERATEDX_IO_ROW *) mysql_fetch_row((MYSQL_RES *) io_result);
+ MYSQL_RES *result= (MYSQL_RES*)io_result;
+ current= result->data_cursor;
+ return (FEDERATEDX_IO_ROW *) mysql_fetch_row(result);
}
@@ -619,19 +622,9 @@ size_t federatedx_io_mysql::get_ref_length() const
void federatedx_io_mysql::mark_position(FEDERATEDX_IO_RESULT *io_result,
void *ref)
{
- MYSQL_ROWS *tmp= 0;
mysql_position& pos= *reinterpret_cast<mysql_position*>(ref);
pos.result= (MYSQL_RES *) io_result;
-
- if (pos.result && pos.result->data)
- {
- for (tmp= pos.result->data->data;
- tmp && (tmp->next != pos.result->data_cursor);
- tmp= tmp->next)
- {}
- }
-
- pos.offset= tmp;
+ pos.offset= current;
}
int federatedx_io_mysql::seek_position(FEDERATEDX_IO_RESULT **io_result,