Hi Sergei,
thnkas for your reply.
In my tests I found that the first table-scan takes about 12 seconds, the second table-scan takes about 25 seconds (and all folowing) scans too).
When I call the function reinit_io_cache() all scans take about 12 seonds. But my implementation was quick and dirty....
I found the reason for this behaviour in the function _mi_read_cache() where the first if()-statement was false in the case of the first scan and true for all other scans.My conclusion was that the IO_CACHE-structure had to be reset when the second scan begins. And this seems to work.
Regards
AugustQ
Am Montag, den 30.01.2017, 12:27 +0100 schrieb Sergei Golubchik:
Hi, AugustQ!
On Jan 29, AugustQ wrote:
Hi,
by playing with the code I think I found something interesting.
My environment: MariaDB 10.0.10, MyISAM-engine
I played with a table-scan, no index is defined on this table. When I
execute a SQL-statement that forces the server to do a second table-
scan on a table this 2nd table-scan will be slow.
The reason for this behaviour is the usage of a buffer: during the 1st
scan this buffer is filled, used and filled again until the whole
table is processed. At the end of the 1st scan it contains the last
bytes of the file. When a 2nd scan is started the reading of the table
starts from the beginning of the file but the buffer and all
associated variables are not reset: the buffer still contains the
bytes from the end of the file, the request cannot be fulfilled by the
buffer so the request has to be handled by reading the bytes directly
from the file using the read()-function of the Std-library. This
takes much more time then simply copying the bytes from the internal
buffer.
Right... MyISAM does not know how you're going to access the table. It
might be a second full table scan. Or may be you'll just want to read
the end of the table?
My idea is: somewhere in the code this situation must be detected and
the buffer (and all associated variables) reset to initial
values. reinit_io_cache() looks like the right candidate for this.
How would that help? You'll get faster execution if MyISAM would preload
first pages of the table. But it doesn't know you're going to do a full
table scan, so why would it preload it?
Regards,
Sergei
Chief Architect MariaDB
and security@mariadb.org