Bug #26697 | Every query to a federated table results in a full scan of MyISAM table. | ||
---|---|---|---|
Submitted: | 27 Feb 2007 21:53 | Modified: | 15 Mar 2007 16:25 |
Reporter: | Jose Luis Palacios | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Federated storage engine | Severity: | S2 (Serious) |
Version: | 5.0.38-BK, 5.0.27, 5.1 | OS: | Linux (Linux, Windows 2000) |
Assigned to: | Assigned Account | CPU Architecture: | Any |
[27 Feb 2007 21:53]
Jose Luis Palacios
[28 Feb 2007 17:16]
Valeriy Kravchuk
Thank you for a problem report. Please, try to repeat with a newerr version, 5.0.27, on linux2, and inform about the results. Please, send als SHOW CREATE TABLE results for both MyISAM and FEDERATED table. Send exact queries you execute, with EXPLAIN results for them. Please, take a look at likely related bugs, bug #25571 and bug #25572 also. I am sure that not every query to every federated table leads to full table scan...
[1 Mar 2007 22:07]
Jose Luis Palacios
show create table + three queries
Attachment: 26697-1.doc (application/msword, text), 60.00 KiB.
[1 Mar 2007 22:08]
Jose Luis Palacios
I have attached 26697-1.doc.
[1 Mar 2007 22:09]
Jose Luis Palacios
Thank's for your quick support!
[13 Mar 2007 11:31]
Valeriy Kravchuk
I verifed the behaviour described with latest 5.0.38-BK on Linux using the following simple test case (4.0.30 was started with general query log enabled): openxs@suse:~/dbs/4.0> bin/mysql --socket=/tmp/mysql.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 4.0.30-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use test; Reading table information for completion of table and column names Database changed this feature to get a quicker startup with -A mysql> drop table t1; Query OK, 0 rows affected (0.03 sec) mysql> create table t1(c1 int primary key, c2 char(100)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1(c1) values (1), (2), (3), (4), (5); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> explain select count(*) from t1\G *************************** 1. row *************************** Comment: Select tables optimized away 1 row in set (0.00 sec) So, for original (MyISAM) table there is no need to access table at all, if you use indexed column! mysql> explain select count(c1) from t1\G *************************** 1. row *************************** Comment: Select tables optimized away 1 row in set (0.00 sec) mysql> explain select count(c2) from t1\G *************************** 1. row *************************** table: t1 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 5 Extra: 1 row in set (0.00 sec) Now, let's create FEDERATED table: openxs@suse:~/dbs/4.0> cd ../5.0 openxs@suse:~/dbs/5.0> bin/mysql -uroot --host=127.0.0.1 test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.0.38 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> drop table tf; ERROR 1051 (42S02): Unknown table 'tf' mysql> create table tf(c1 int primary key, c2 char(100)) engine=federated conne ction='mysql://root:root@127.0.0.1:3340/test/t1'; Query OK, 0 rows affected (0.01 sec) mysql> show create table tf; +-------+----------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------+ | tf | CREATE TABLE `tf` ( `c1` int(11) NOT NULL, `c2` char(100) default NULL, PRIMARY KEY (`c1`) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root:root@127.0.0. 1:3340/test/t1' | +-------+----------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------+ 1 row in set (0.00 sec) mysql> explain select count(*) from tf; +----+-------------+-------+------+---------------+------+---------+------+----- -+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+-------+ | 1 | SIMPLE | tf | ALL | NULL | NULL | NULL | NULL | 105 | | +----+-------------+-------+------+---------------+------+---------+------+----- -+-------+ 1 row in set (0.00 sec) mysql> select count(*) from tf; +----------+ | count(*) | +----------+ | 5 | +----------+ 1 row in set (0.01 sec) mysql> exit Bye Now let us check general query log of target instance: openxs@suse:~/dbs/5.0> cat ../4.0/var/suse.log /home/openxs/dbs/4.0/libexec/mysqld, Version: 4.0.30-log, started with: Tcp port: 3340 Unix socket: /tmp/mysql.sock Time Id Command Argument ... 070312 11:54:16 3 Query drop table t1 070312 11:54:24 3 Query create table t1(c1 int primary key, c2 char( 100)) 070312 11:54:33 3 Query insert into t1(c1) values (1), (2), (3), (4) , (5) 070312 11:54:38 3 Query explain select count(*) from t1 070312 11:54:42 3 Query explain select count(c1) from t1 070312 11:54:46 3 Query explain select count(c2) from t1 070312 11:55:09 3 Quit ... 070312 11:56:06 7 Connect root@localhost on test 7 Query SELECT * FROM `t1` WHERE 1=0 7 Quit 070312 11:56:09 8 Connect root@localhost on test 070312 11:56:16 8 Query SHOW TABLE STATUS LIKE 't1' 070312 11:56:25 8 Query SHOW TABLE STATUS LIKE 't1' 8 Query SELECT `c1`, `c2` FROM `t1` So, we obviously select ALL COLUMNS (?) and ALL ROWS just to get count(*). This is a bug, that seriosly limits FEDERATED tables usage in practice.
[13 Feb 2013 8:22]
Laurentiu Ionescu
Yes, it is the same issue, thanks. I am just a little disappointed that this issue is not solved from 2007 till now. I was hoping to have something similar with DB Links from other systems also in MySQL and Federated was the only workaround for this. I see now why this engine is off by default :) is not very useful in real life.