在进行性能分析之前,需要定位耗时查询。MySQL提供了一个内置的耗时查询日志。使用前,打开my.cnf文件,将slow_query_log设置为“On”。同时,将long_query_time设置为一个对于查询来说比较慢的时间(秒),比如0.2。slow_query_log_file设置为要保存日志文件的路径。然后运行代码,执行时间超过设置限制的查询将被记录在日志中。一旦找到这些烦人的查询,就可以调查缓慢的原因。MySQL提供了EXPLAIN关键字。可以与SELECT、DELETE、INSERT、REPLACE、UPDATE语句一起使用。只需将其添加到查询的开头,如下所示:EXPLAINSELECTpicture.id,picture.titleFROMpictureLEFTJOINalbumONpicture.album_id=album.idWHEREalbum.user_id=1;结果是对数据访问过程的分析。每行代表一个查询相关的数据表:重点是表名,使用的key,执行查询时扫描的行数。此查询为每条图片记录扫描图片表中的200万行和相册表中的20,000行。也就是说,查询实际上扫描了相册表中的400亿行。这个过程可以更有效率。索引使用索引可以大大提高性能。就像地址簿中的名字。找名字可以从头翻到尾,也可以找到对应的人物标签页快速定位。使用索引来避免不必要的表扫描。例如,在picture.album_id上添加一个索引:ALTERTABLEpictureADDINDEX(album_id);现在执行查询,不会扫描整个图片列表。首先会扫描所有的相册表,找到属于该用户的相册,然后利用album_id列索引快速定位到对应的图片。扫描的行数减少到200,000,比原始查询快317倍。通过以下方式添加索引可以保证两个表都能使用对应的key:ALTERTABLEalbumADDINDEX(user_id);这次不会全盘扫描专辑表,可以通过user_id键精确定位到对应的专辑。那么扫描完100张相册后,也可以很快找到album_id键相关的图片。每张表使用一个键进行查询性能优化,结果比原始查询快380倍。但是并不代表可以随意添加索引,因为索引会增加写入数据库的时间。因此,索引的使用导致读取时间缩短和写入时间增加。因此,如果可以提高读取性能,请添加索引。使用EXPLAIN确认索引是否被查询使用,如果没有则删除。
