MySQL
  Home arrow MySQL arrow Page 6 - MySQL Optimization, part 2
Dev Shed Forums 
Administration  
AJAX  
Apache  
BrainDump  
DHTML  
Flash  
Java  
JavaScript  
Multimedia  
MySQL  
Oracle  
Perl  
PHP  
Practices  
Python  
Reviews  
Security  
Style-Sheets  
Web Services  
XML  
Zend  
Zope  
Forums Sitemap 
IBM® developerWorks 
Sun Developer Network 
Dedicated Servers 
E-Commerce Hosting 
Linux Web Hosting 
Managed Hosting 
Small Business Hosting 
Moblin 
JMSL Numerical Library 
VPS Hosting 
Weekly Newsletter

 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
MYSQL

MySQL Optimization, part 2
By: Sams Publishing
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 5 stars5 stars5 stars5 stars5 stars / 28
    2005-04-20

    Table of Contents:
  • MySQL Optimization, part 2
  • 6.4 Optimizing Database Structure
  • 6.4.5 How MySQL Uses Indexes
  • 6.4.6.1 Shared Key Cache Access
  • 6.4.6.6 Restructuring a Key Cache
  • 6.5.2 Tuning Server Parameters
  • 6.5.4 How MySQL Uses Memory
  • 6.6.1.1 Using Symbolic Links for Databases on Unix

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    ADVERTISEMENT


    MySQL Optimization, part 2 - 6.5.2 Tuning Server Parameters


    (Page 6 of 8 )

    You can determine the default buffer sizes used by the mysqld server with this command (prior to MySQL 4.1, omit --verbose):

    shell> mysqld --verbose --help

    This command produces a list of all mysqld options and configurable system variables. The output includes the default variable values and looks something like this:

    back_log                 current value: 5
    bdb_cache_size           current value: 1048540
    binlog_cache_size        current value: 32768
    connect_timeout          current value: 5
    delayed_insert_limit     current value: 100
    delayed_insert_timeout   current value: 300
    delayed_queue_size       current value: 1000
    flush_time               current value: 0
    interactive_timeout      current value: 28800
    join_buffer_size         current value: 131072
    key_buffer_size          current value: 1048540
    long_query_time          current value: 10
    lower_case_table_names   current value: 0
    max_allowed_packet       current value: 1048576
    max_binlog_cache_size    current value: 4294967295
    max_connect_errors       current value: 10
    max_connections          current value: 100
    max_delayed_threads      current value: 20
    max_heap_table_size      current value: 16777216
    max_join_size            current value: 4294967295
    max_sort_length          current value: 1024
    max_tmp_tables           current value: 32
    max_write_lock_count     current value: 4294967295
    myisam_sort_buffer_size  current value: 8388608
    net_buffer_length        current value: 16384
    net_read_timeout         current value: 30
    net_retry_count          current value: 10
    net_write_timeout        current value: 60
    read_buffer_size         current value: 131072
    read_rnd_buffer_size     current value: 262144
    slow_launch_time         current value: 2
    sort_buffer              current value: 2097116
    table_cache              current value: 64
    thread_concurrency       current value: 10
    thread_stack             current value: 131072
    tmp_table_size           current value: 1048576
    wait_timeout             current value: 28800

    If there is a mysqld server currently running, you can see what values it actually is using for the system variables by connecting to it and issuing this statement:

    mysql> SHOW VARIABLES;

    You can also see some statistical and status indicators for a running server by issuing this statement:

    mysql> SHOW STATUS;

    System variable and status information also can be obtained using mysqladmin:

    shell> mysqladmin variables
    shell> mysqladmin extended-status

    You can find a full description for all system and status variables in Section 4.2.3, "Server System Variables," and Section 4.2.4, "Server Status Variables."

    MySQL uses algorithms that are very scalable, so you can usually run with very little memory. However, normally you will get better performance by giving MySQL more memory.

    When tuning a MySQL server, the two most important variables to configure are key_buffer_size and table_cache. You should first feel confident that you have these set appropriately before trying to change any other variables.

    The following examples indicate some typical variable values for different runtime configurations. The examples use the mysqld_safe script and use --var_name=value syntax to set the variable var_name to the value value. This syntax is available as of MySQL 4.0. For older versions of MySQL, take the following differences into account:

    • Use safe_mysqld rather than mysqld_safe.

    • Set variables using --set-variable=var_name=value or -O var_name=value syntax.

    • For variable names that end in _size, you may need to specify them without _size. For example, the old name for sort_buffer_size is sort_buffer. The old name for read_buffer_size is record_buffer. To see which variables your version of the server recognizes, use mysqld --help.

    If you have at least 256MB of memory and many tables and want maximum performance with a moderate number of clients, you should use something like this:

    shell> mysqld_safe --key_buffer_size=64M --table_cache=256 \
    --sort_buffer_size=4M --read_buffer_size=1M &

    If you have only 128MB of memory and only a few tables, but you still do a lot of sorting, you can use something like this:

    shell> mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M

    If there are very many simultaneous connections, swapping problems may occur unless mysqld has been configured to use very little memory for each connection. mysqld performs better if you have enough memory for all connections.

    With little memory and lots of connections, use something like this:

    shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=100K \
    --read_buffer_size=100K &

    Or even this:

    shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=16K \
    --table_cache=32 --read_buffer_size=8K \
    --net_buffer_length=1K &

    If you are doing GROUP BY or ORDER BY operations on tables that are much larger than your available memory, you should increase the value of read_rnd_buffer_size to speed up the reading of rows after sorting operations.

    When you have installed MySQL, the support-files directory will contain some different my.cnf sample files: my-huge.cnf, my-large.cnf, my-medium.cnf, and my-small.cnf. You can use these as a basis for optimizing your system.

    Note that if you specify an option on the command line for mysqld or mysqld_safe, it remains in effect only for that invocation of the server. To use the option every time the server runs, put it in an option file.

    To see the effects of a parameter change, do something like this (prior to MySQL 4.1, omit --verbose):

    shell> mysqld --key_buffer_size=32M --verbose --help

    The variable values are listed near the end of the output. Make sure that the --verbose and --help options are last. Otherwise, the effect of any options listed after them on the command line will not be reflected in the output.

    For information on tuning the InnoDB storage engine, see Section 9.12, "InnoDB Performance Tuning Tips."

    6.5.3 How Compiling and Linking Affects the Speed of MySQL

    Most of the following tests were performed on Linux with the MySQL benchmarks, but they should give some indication for other operating systems and workloads.

    You get the fastest executables when you link with -static.

    On Linux, you will get the fastest code when compiling with pgcc and -O3. You need about 200MB memory to compile sql_yacc.cc with these options, because gcc/pgcc needs a lot of memory to make all functions inline. You should also set CXX=gcc when configuring MySQL to avoid inclusion of the libstdc++ library, which is not needed. Note that with some versions of pgcc, the resulting code will run only on true Pentium processors, even if you use the compiler option indicating that you want the resulting code to work on all x586-type processors (such as AMD).

    By just using a better compiler and better compiler options, you can get a 10-30% speed increase in your application. This is particularly important if you compile the MySQL server yourself.

    We have tested both the Cygnus CodeFusion and Fujitsu compilers, but when we tested them, neither was sufficiently bug-free to allow MySQL to be compiled with optimizations enabled.

    The standard MySQL binary distributions are compiled with support for all character sets. When you compile MySQL yourself, you should include support only for the character sets that you are going to use. This is controlled by the --with-charset option to configure.

    Here is a list of some measurements that we have made:

    • If you use pgcc and compile everything with -O6, the mysqld server is 1% faster than with gcc 2.95.2.

    • If you link dynamically (without -static), the result is 13% slower on Linux. Note that you still can use a dynamically linked MySQL library for your client applications. It is the server that is most critical for performance.

    • If you strip your mysqld binary with strip mysqld, the resulting binary can be up to 4% faster.

    • For a connection from a client to a server running on the same host, if you connect using TCP/IP rather than a Unix socket file, performance is 7.5% slower. (On Unix, if you connect to the hostname localhost, MySQL uses a socket file by default.)

    • For TCP/IP connections from a client to a server, connecting to a remote server on another host will be 8-11% slower than connecting to the local server on the same host, even for connections over 100Mb/s Ethernet.

    • When running our benchmark tests using secure connections (all data encrypted with internal SSL support) performance was 55% slower than for unencrypted connections.

    • If you compile with --with-debug=full, most queries will be 20% slower. Some queries may take substantially longer; for example, the MySQL benchmarks ran 35% slower. If you use --with-debug (without =full), the slowdown will be only 15%. For a version of mysqld that has been compiled with --with-debug=full, you can disable memory checking at runtime by starting it with the --skip-safemalloc option. The end result in this case should be close to that obtained when configuring with --with-debug.

    • On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster than one compiled with gcc 3.2.

    • On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster in 32-bit mode than in 64-bit mode.

    • Compiling with gcc 2.95.2 for UltraSPARC with the -mcpu=v8 -Wa,-xarch=v8plusa options gives 4% more performance.

    • On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native threads on a single processor. With more load or CPUs, the difference should be larger.

    • Compiling on Linux-x86 using gcc without frame pointers (-fomit-frame-pointer or -fomit-frame-pointer -ffixed-ebp) makes mysqld 1-4% faster.

    Binary MySQL distributions for Linux that are provided by MySQL AB used to be compiled with pgcc. We had to go back to regular gcc due to a bug in pgcc that would generate code that does not run on AMD. We will continue using gcc until that bug is resolved. In the meantime, if you have a non-AMD machine, you can get a faster binary by compiling with pgcc. The standard MySQL Linux binary is linked statically to make it faster and more portable.

    More MySQL Articles
    More By Sams Publishing


       · I'm a newbie on this thing, so I'm trying to change this variables on /etc/my.cnf...
     

    Buy this book now. This article is excerpted from MySQL Administrator's Guide, by MySQL AB (editor) (Sams, 2004; ISBN 0672326345). Check it out at your favorite bookstore today. Buy this book now.

       

    MYSQL ARTICLES

    - Take Some Load off MySQL with MemCached
    - MySQL Table Prefix Changer Tool in PHP
    - Using the SIGNAL Statement for Error Handling
    - Error Handling Examples
    - Error Handling
    - Completing a Search Engine with MySQL and PH...
    - Paginating Result Sets for a Search Engine B...
    - Building a Search Engine with MySQL and PHP 5
    - Using Boolean Operators for Full Text and Bo...
    - PHP, MySQL and the PEAR Database
    - Working with PHP and MySQL
    - Getting PHP to Talk to MySQL
    - Creating an RSS Reader: the Reader
    - MySQL Security Overview
    - Creating the Admin Script for a PHP/MySQL Bl...





    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 5 hosted by Hostway