One of our engineers first installed MySQL on one of our Sun boxes which was doing nothing more than MySQL... It seems we also put it on the server and turned it on... it behaved very badly. Essentially when we started to investigate MySQL and find out if we could use it we discovered that our Sun box with four processors and 4Gbytes of ram was running MySQL in 64M of memory... it's an easy mistake to make, and the lesson here is that out of the box (as it were) MySQL settings are a little on the low side for performance... but work well for a shared environment where you may have web server, mail server and more all running on the same box. If you want MySQL to sing... you are going to have to do a lot of tuning.

On the table_cache issue... We have about 40 tables per database, and some of our servers have 30 databases. Our servers have as many as 500 connections... one server at random which has an uptime of 60 days shows:

mysql1 (none): show status like 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 2748  |
| Opened_tables | 3288  |
+---------------+-------+
2 rows in set (0.01 sec)

mysql1 (none): show variables like 'table_cache';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| table_cache   | 4096  |
+---------------+-------+
1 row in set (0.01 sec)

So we have a table cache value, but it's clearly on the high side and could be lower. Yours at 64 is on the low side.

While I won't ignore table cache as being important, there are many many performance tuning things that need to get done to have an impact on the server.

Firstly (knowing the type of things you are doing) InnoDB will likely be a far better choice for most of your tables than the default database engine, myisam. You need to tune the machine to run InnoDB, and then convert your data to InnoDB. If you are using MySQL 4.1 (which I can't remember) I would advise using innodb_file_per_table. If you are looking at upgrading to 4.1 I'd do that first before switching to innodb_file_per_table... it's a little hard to claim back the shared table space after the fact. If not 4.1 then go with InnoDB and build a big enough shared table space file set to hold all your data with room to spare. We typically build it with 20 2Gbyte files... for 40Gbytes of InnoDB table space.

Decide how much memory you have to run MySQL... i the server does only MySQL, this is easy... if it's also a web server running Apache and so on, then you have to decide the mix. Assuming MySQL only give InnoDB 80% of the server's total memory, up to certain limits with 32 bit operating systems and the like... For OS X we found these are pretty much the magic numbers for max values if you have more than 2Gbytes of ram but can't handle 64 bit:

 innodb_buffer_pool_size=1850M
 innodb_additional_mem_pool_size=256M
innodb_log_files_in_group=2
innodb_log_file_size=250M
innodb_log_buffer_size=20M
innodb_thread_concurrency=16
innodb_flush_log_at_trx_commit=0
innodb_lock_wait_timeout=30

Once you convert everything to InnoDB the regular MySQL buffers have less importance, but should still have some values.

InnoDB or not the query_cache is a good thing, but don't set it too high... We are at 128Mbytes and that's a little higher than we need... it appears we could live in under 64Mbytes, and our query cache handles about 25% of our queries... properly set it's a good thing.

So... most likely switching to InnoDB will improve performance... Managing all your memory settings and caches so that the ones that matter have values that will help will make a great deal of difference... of course to do this you'll need to make a my.cnf file and install it where MySQL will look for it.

Also important for tuning is watching the slow queries, finding out if there are moe things you can do with indexes, or if there are other ways to optimize the queries. Turn on the slow query log... leave it set to the default 10 seconds... find out what queries are running longer than 10 seconds and figure out how to optimize them... changing indexes, changing the query etc... Once you have worked that out and your slow query log gets few hits, reduce it to 5 seconds and work through those queries... again reduce it further as you work out the performance issues and you'll find that you are streaming along.

There's a lot more that can be done with specific memory settings and so on... but I think I've given you a handful of things to get started on, and you can come back for more when you have made some headway on this part.

Best Regards, Bruce

On Sep 7, 2005, at 4:28 PM, Scott Haneda wrote:

Unless I am totally off base here, the mysql docs tell very little in
regards to how to performance tune mysql.

So far I have found this article to help:
<http://www.databasejournal.com/features/mysql/article.php/ 10897_1402311_3>
But it still leaves me with a ton of questions.

For starters, and don't laugh, I just installed mysql and let it run,
started adding sites to it and such. The machine has 1 gig of ram in in,
but at times, I could ask it were a little snappier.  It is a 1.2Ghz
machine.

First thing I did last night was to try to get a hnalde on this. From what I can tell, I have no my.cnf file in place, so there must be some default settings that are compiled in. I set up a cron job to run the following:

show variables like 'table_cache'
show status like 'open%_tables'

I have been running this once a minute for a day now, how long should I run it to get an idea of what I need to change to better suit my servers load
usage?

First entry after a mysql restart:
Wed Sep 7 03:18:00 PDT 2005
table_cache 64
Open_tables 64 Opened_tables 1050
-----------

Last entry as of now:
-----------
Wed Sep 7 16:27:01 PDT 2005
table_cache 64
Open_tables 64 Opened_tables 4407

So it looks like Opened_tables is going to increase forever at the rate I have it, which I am guessing is not a good thing, but not sure what I need
to do to fix this.

I am really looking for some pretty detailed docs on exactly what I can do
in my.cnf to make this work out better.

Thanks again, and if there are any questions that would help me get a better
answer, please let me know.
--
-------------------------------------------------------------
Scott Haneda                                Tel: 415.898.2602
<http://www.newgeo.com>                     Novato, CA U.S.A.



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/mysql? [EMAIL PROTECTED]




--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to