mysql 加快查询速度
在配置慢速查询之前,需要找到它们。
MySQL具有内置的慢查询日志。 要使用它,请打开my.cnf文件,并将slow_query_log变量设置为“ On”。 将long_query_time设置为查询应花费的秒数,例如0.2。 将slow_query_log_file设置为要保存文件的路径。 然后运行您的代码,超过指定阈值的任何查询将添加到该文件中。
一旦知道哪些是令人讨厌的查询,就可以开始研究使它们变慢的原因。 MySQL提供的一种工具是EXPLAIN关键字。 它与SELECT , DELETE , INSERT , REPLACE和UPDATE语句一起使用。 您只需像这样为查询添加前缀:
EXPLAIN
SELECT picture
. id
, picture
. title
FROM picture
LEFT
JOIN album
ON picture
. album_id
= album
. id
WHERE album
. user_id
=
1 ;
您得到的结果说明了如何访问数据。 您会为查询中涉及的每个表看到一行:
这里重要的部分是表名,使用的键以及在执行查询期间扫描的行数。
它扫描2,000,000张照片,然后每张照片扫描20,000张相册。 这意味着它实际上扫描了400亿行以查找专辑表。 但是,您可以使此过程更加有效。
指标
您可以通过使用索引来显着提高性能。 将数据视为地址簿中的名称。 您可以浏览所有页面,也可以在右侧的字母选项卡上快速找到所需的名称。
使用索引可以避免不必要的表访问。 例如,您可以像这样在picture.album_id上添加索引:
ALTER TABLE picture ADD INDEX ( album_id ) ;
现在,如果您运行查询,该过程将不再涉及扫描整个图片列表。 首先,扫描所有相册以找到属于用户的相册。 之后,可使用索引的album_id列快速定位图片。 这将扫描的行数减少到200,000。 查询也比原始查询快317倍。
您可以通过添加以下索引来确保两个表都使用键:
ALTER TABLE album ADD INDEX ( user_id ) ;
这次,相册表没有被完整扫描,但是使用user_id键可以快速找到正确的相册。 扫描这100张相册时,将使用album_id键精确定位关联的图片。 每个表都使用一个键来实现最佳性能,从而使查询比原始查询快380倍。
这并不意味着您应该在任何地方添加索引,因为每个索引会使写入数据库的时间更长。 您在阅读中有所收获,但在书写中却有所损失。 因此,仅添加实际上可提高读取性能的索引。 使用EXPLAIN确认并删除查询中未使用的任何索引。
还有许多其他方法可以提高性能,您可以在我的OSCON演讲“ 加快数据库速度300倍”中了解更多信息。
安娜将 在德克萨斯州奥斯汀举行的OSCON 2017上发表 300次“加速数据库”的 演讲。 如果您有兴趣参加会议,请在注册时使用此折扣代码,以供我们的读者使用: PCOS 。
翻译自: https://opensource.com/article/17/5/speed-your-mysql-queries-300-times
mysql 加快查询速度