Development, Analysis And Research


MySQL & PHP Performance Optimization Tips

Posted in Db, General by Andrew Johnstone on the July 25th, 2007
, , , ,

In high performance web applications you will always have bottlenecks within your application. Identifying these bottlenecks and optimizing is a tedious task and typically show themselves underload. A single bad/unindexed query can bring a server to its knees. A large number of rows will also help to highlight any poor queries, and on very large datasets you may come to the point where you may have to make decisions whether to denormilize database schema.

Explain each page

Whilst I develope sites, I typically print out all queries, EXPLAIN each select statement at the bottom of each page, and highlight it red if its doing a full table scan, temp tables or a filesort. As well as displaying SHOWS INDEXES FROM TABLE…

Not only will it help you to optimize sites, you can also see bad logic and areas to optimize such as a query for each loop when looking through a users table for example.

MySQL indexing optimization

How do you identify where bottlenecks occur?

One of my favourite linux commands lately is the watch command. For Mac users you can get this from macports via “sudo port install watch”. Also a few other handy applications are mysqlreport, mytop.

# Appends file with processlist
watch -n1 “mysqladmin -uroot processlist >>watch.processlist.txt”

# Count the number of locked processes
watch -n1 “mysqladmin -uroot processlist | grep -i ‘lock’ | wc -l “;

# Count the number of processes sleep
watch -n1 “mysqladmin -uroot processlist | grep -i ’sleep’ | wc -l “;

# Run a specific query every second
watch -n1 “mysql -uadmin -p`cat /etc/psa/.psa.shadow` trade_engine –execute “SELECT NOW(),date_quote FROM sampleData WHERE 1=1 AND permission = ‘755′ AND  symbol=’IBZL’ GROUP BY date_quote;” ”

# Emails mysqlreport every 60 seconds
watch -n60 mysqlreport –all –email andrew@email.com

# Displays process list as well as appending the contents to a file
watch -n1 “mysqladmin -uadmin -p`cat /etc/psa/.psa.shadow` processlist | tee -a process.list.txt”

Watching the processlist is very handy in identifying locked, sleeping or sorting process states. If you have a large number of locked processes you typically should change the table type to INNODB, which supports row level locking. if you have a large number of sleeping connections, and you have persistent connections enabled, most likely indicates that connections are not being reused.

Running a specific query every second is exceptionally handy, the example I gave indicates whether one of our crons is correctly functioning and as each row is inserted you can watch something being either inserted or updated. mysqlreport gives numerous peices of information, extremely helpful in identifying issues, you can see more indepth at hackmysql.com/mysqlreportguide.

Look at the mysql slow query log and optimize each query starting with the most common, think whether you have to execute that query at all and use a cache such as memcached.

I also typically tend to look at the following:

  • vmstat -S M
  • ps axl | grep -i ‘mysql’
  • pstree –G
  • free –m

Reference:
http://dev.mysql.com/tech-resources/presentations/presentation-oscon2000-20000719/index.html

Technorati , , , ,

Popularity: 84% [?]

14 Responses to 'MySQL & PHP Performance Optimization Tips'

Subscribe to comments with RSS or TrackBack to 'MySQL & PHP Performance Optimization Tips'.


  1. on July 25th, 2007 at 8:26 am

    […] Johnstone has posted a few handy tips to help you find out where in your application a certain kind of issue might lie - MySQL/PHP […]


  2. on July 28th, 2007 at 7:45 am

    Test

  3. omry said,

    on July 28th, 2007 at 7:52 am

    Nice post, would be nice if you did some SQL profiling to FireStats and let me know what you find. :).


  4. on July 30th, 2007 at 9:53 am

    […]  mysql and php performance and optimization tips […]

  5. Xaprb said,

    on July 30th, 2007 at 10:16 am

    innotop is similar to mytop, but much more capable:
    http://innotop.sourceforge.net/


  6. on August 15th, 2007 at 6:59 am

    […] MySQL & PHP Performance Optimization Tips […]

  7. kvz said,

    on October 6th, 2007 at 11:07 am

    Another article about optimizing the performance of apache & php for high traffic loads:
    http://kevin.vanzonneveld.net/techblog/article/survive_heavy_traffic_with_your_webserver


  8. on June 12th, 2008 at 5:32 pm

    […] MySQL & PHP Performance Optimization Tips […]


  9. on June 15th, 2008 at 1:42 pm

    […] MySQL & PHP Performance Optimization Tips […]


  10. on June 16th, 2008 at 3:52 pm

    […] MySQL & PHP Performance Optimization Tips […]


  11. on June 19th, 2008 at 1:38 pm

    […] MySQL & PHP Performance Optimization Tips […]


  12. on June 22nd, 2008 at 8:41 am

    […] MySQL & PHP Performance Optimization Tips […]


  13. on June 25th, 2008 at 5:19 am

    […] MySQL & PHP Performance Optimization Tips […]


  14. on July 2nd, 2008 at 11:18 pm

    […] MySQL & PHP Performance Optimization Tips […]

Leave a Reply