Hi,
I saw a couple of posts about this and thought I'd join the chorus.  Running 
version 4.1.7 on a WinXP system.

I have a table "mindata" containing just over 1 million lines of price/volume 
data for exchange-traded stocks.  It's for a .NET web application.  There are 
about 3500 different stocks in the table.  Each has it's own ID number, and 
each has about 300 lines corresponding to different dates:

mysql> describe mindata;
+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| ID        | int(5)     | YES  | MUL | NULL    |       |
| TimeStamp | date       | YES  | MUL | NULL    |       |
| Close     | float      | YES  |     | NULL    |       |
| Chg       | float      | YES  |     | NULL    |       |
| Open      | float      | YES  |     | NULL    |       |
| Volume    | bigint(20) | YES  |     | NULL    |       |
| Low       | float      | YES  |     | NULL    |       |
| High      | float      | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+

mysql> show index from mindata;
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | 
Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| mindata |          1 | TimeStamp |            1 | TimeStamp   | A         |   
      320 |     NULL | NULL   | YES  | BTREE      |         |
| mindata |          1 | iID       |            1 | ID          | A         |   
     3538 |     NULL | NULL   | YES  | BTREE      |         |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+


When I first turn on the computer queries are disturbingly slow!  
mysql> Select * from mindata where ID = 2345;
+------+------------+-------+-------+-------+--------+-------+-------+
| ID   | TimeStamp  | Close | Chg   | Open  | Volume | Low   | High  |
+------+------------+-------+-------+-------+--------+-------+-------+
| 2345 | 2003-09-15 | 17.55 |  -0.1 | 17.64 |  19200 |  17.5 | 17.64 |
| 2345 | 2003-09-16 | 17.58 |  0.03 |  17.5 |   9300 | 17.49 | 17.65 |
| 2345 | 2003-09-17 |  17.5 | -0.08 | 17.53 |   6500 | 17.46 |  17.6 |
<snip>
321 rows in set (1.58 sec)

Does this make sense?  I could swear I've had much larger tables in the past 
that were much faster.  Anyway...

Next I attempt to load the keys into the cache:
mysql> load index into cache mindata;
+---------------------+--------------+----------+----------+
| Table               | Op           | Msg_type | Msg_text |
+---------------------+--------------+----------+----------+
| megascanner.mindata | preload_keys | status   | OK       |
+---------------------+--------------+----------+----------+
1 row in set (0.00 sec)

Hmmm... It looks like it worked, but the index file on the disk is 34MB, 
obviously it would take longer that 0.00 sec to load it.

Here's another query to see if the speed has improved (picking a different ID 
number this time to avoid caching the results):
mysql> Select * from mindata where ID = 3345;
+------+------------+-------+-------+-------+---------+-------+-------+
| ID   | TimeStamp  | Close | Chg   | Open  | Volume  | Low   | High  |
+------+------------+-------+-------+-------+---------+-------+-------+
| 3345 | 2003-09-15 | 42.56 |  0.52 | 42.05 |  274800 | 42.02 | 42.63 |
| 3345 | 2003-09-16 | 42.89 |  0.33 |  42.2 |  253866 |  42.2 | 42.99 |
| 3345 | 2003-09-17 | 40.27 | -2.62 |  40.7 | 1582500 | 39.55 | 41.35 |
| 3345 | 2003-09-18 | 40.78 |  0.51 | 40.27 |  397300 | 40.01 | 40.83 |
<snip>
321 rows in set (1.63 sec)
The query speed hasn't improved.  It looks like Load Index Into Cache didn't do 
anything at all.

But here's something that does get the indexes loaded into memory, apparently 
as a side-effect:  I can disable, then re-enable the keys.  After doing this 
the queries are blindly fast.  Unfortunately there's no telling how long things 
will remain in the cache.  Sometimes it stays there all day, but sometimes not. 
 I don't see any way to get control over it.  I can't find any clear 
explanation of what's going.

mysql> alter table mindata disable keys;alter table mindata enable keys;  (two 
queries on one line)
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (5.66 sec)

Now the queries are blindly fast:
mysql> Select * from mindata where ID = 1001;
+------+------------+-------+-------+-------+---------+-------+-------+
| ID   | TimeStamp  | Close | Chg   | Open  | Volume  | Low   | High  |
+------+------------+-------+-------+-------+---------+-------+-------+
| 1001 | 2003-09-15 | 28.72 |  -0.2 | 28.95 |  290600 |  28.6 | 29.03 |
| 1001 | 2003-09-16 | 28.85 |  0.13 | 28.72 |  454200 | 28.72 | 28.92 |
| 1001 | 2003-09-17 | 28.25 |  -0.6 | 28.96 |  511800 | 28.17 | 28.96 |
| 1001 | 2003-09-18 | 28.63 |   0.4 | 28.43 |  403900 | 28.35 | 28.73 |
| 1001 | 2003-09-19 | 28.61 | -0.06 | 28.67 |  343333 | 28.49 |  28.8 |
<snip>
321 rows in set (0.02 sec)

So I'm hoping somebody who knows the inner workings of MySql can explain why 
Load Index Into Cache doesn't work, and why my inadvertent work-around does?  
Should I report it as a bug???

Best rgds
Phil 

Reply via email to