We have a production database that has 4,000+ tables. For a variety of reasons, 
our CGIs always
have to run "show tables" to generate a list of all tables in the database.

This is by far our slowest query; it currently takes about 100 milliseconds. It 
is
apparently never cached; here's a relevant transcript:

      mysql ...
      use hg18
      show tables
      4421 rows in set (0.09 sec)
      show tables
      4421 rows in set (0.13 sec)         <-- note about same speed (i.e. not 
cached)

I have seen this in versions 4.0.27-standard-log and 5.0.41-community

As an alternative, I tried the new SELECT ... FROM INFORMATION_SCHEMA.TABLES,
but it is much slower:

   SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'hg18';
   4421 rows in set (1.73 sec)
   SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'hg18';
   4421 rows in set (1.67 sec) <-- second run; not cached and still very slow

Here's an unindexed query in a large table to show that caching is working for 
normal queries:

   flush table gc5Base;
   select count(*) from gc5Base;
   562977 rows
   select count(*) from gc5Base where sumSquares = 1684400;
   1 row in set (0.38 sec)
   select count(*) from gc5Base where sumSquares = 1684400;
   1 row in set (0.00 sec)

This is an almost exclusively read-only database (there shouldn't be any 
locking issues).
All the tables are MyISAM.

Does anyone know why "show tables" is so slow?

Is there any way to speed this up?

We can create our own table with a cached copy of the results of "show tables",
but we would prefer to avoid that because it is kludgy.

thanks!

-larry

Larry Meyer                                  lar...@soe.ucsc.edu
UCSC Genome Bioinformatics Group          http://genome.ucsc.edu

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to