这个萌芽扫描了picture表2百万行,对每个picture记录扫描了album表2万行。意味着,该萌芽实际扫描了album表400亿行。这个过程可以更高效。
在进行机能分析前,须要先定位耗时萌芽。
MySQL 供给了内建低砟瓯萌芽日记。应用前,打开 my.cnf 文件,将slow_query_log 设置为”On”。 同时将 long_query_time 设置为一个对一次萌芽来说比较慢的时光(秒数),比如 0.2。slow_query_log_file 设置为你想保存日记文件的路径。然后运行代码,履行时光跨越设定上限的萌芽将会被记录到日记中。
应用索引可以避免无须要的表扫描。比如在picture.album_id上添加索引:
一旦定位这些常人的萌芽,就可以商量慢的原因。MySQL供给了EXPLAIN关键字。可以与SELECT、DELETE、INSERT、WordStr、UPDATE语句一路应用。只须要如下一样添加到萌芽开端处:
- EXPLAIN SELECT picture.id, picture.title
- FROM picture
- LEFT JOIN album ON picture.album_id = album.idWHERE album.user_id = 1;
结不雅是对数据拜访过程的解析。每行代表一个萌芽相干的数据表:
重点是表名、应用的key、萌芽履行时所扫描的行数。
索引
应用索引,可以极大年夜晋升机能。比如地址簿中的名字。找一个名字,你可以大年夜头翻到尾,也可以找到响应的字符标签页来快速定位。
- ALTER TABLE picture ADD INDEX(album_id);
如今履行萌芽,就不会扫描全部picture列表了。起首,所有的album表会被扫描以找到属于该用户的album,然后,应用album_id列索引快速定位对应的picture。扫描的行数削减到了20万,比原始萌芽快了317倍。
按照以下方法添加索引可以确保两张表都能应用对应键:
- ALTER TABLE album ADD INDEX(user_id);
此次,album表不会被全部扫描,经由过程user_id键就可以准肯定位响应的album。然后这100个album被扫描后,经由过程album_id键相干的picture也可以快速找到。每张表都用到了一个键进行萌芽机能优化,结不雅比原始萌芽快了380倍。
然则并不料味着可以随便添加索引,因为索引会导致写数据库用时增长。所以应用索引导致读用时缩短,写竽暌姑时增长。是以,如不雅能晋升读机能时再添加索引。应用EXPLAIN来确认索引是否被萌芽用到,没有就删除。
【编辑推荐】
- MySQL 5.7忘记root暗码及修改root暗码的办法
- 基于日记(binlog),若何完成MySQL主大年夜复制搭建
- MySQL数据库常用架构设计
- MySQL数据恢复的九把瑞士军刀
- MySQL并发引起的逝世锁问题
推荐阅读
如今是时刻把公共云和私有/混淆云的┞幅辩抛之脑后了吗?就像Mac与PC,或开放与专有一样,似乎技巧上最大年夜的┞幅议就是保质期,并且在云基本架构上产生冲突的时光已经接近尾声。正如Inf>>>详细阅读
本文标题:如何将MySQL查询速度提升300倍
地址:http://www.17bianji.com/lsqh/35157.html
1/2 1