- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大型网站优化-MySQL优化
执行计划
MySQL提供一种行为分析工具,可以使用它来查看MySQL执行SQL语句的一个行为。
大概可以看到MySQL将如何使用索引来查找数据,或者MySQL使不使用索引来查询。
MySQL执行概图:在生成最终的执行树的时候,去查看MySQL使用了那个索引,或者怎么使用索引。
具体使用:
在查询语句中,在前面加上关键字 explain或者同义词desc
# explain select * from tableName where id = ID;
简单分析:
使用主键索引:使用主键索引查找后,快速定位(1)
1. const 最好出现这个,这个是最优。
未使用索引:进行全表扫描(300024)
分析type列:
range : 如果是范围查询,并且数据量小的时候,MySQL会使用索引快速的定位。
思考:范围查询为什么会使用索引?
因为索引是一种排好序的数据结构,既然是拍好序的,那么查找范围是不是非常快。
因为范围可以直接冲拍好序的索引中取出来,取出来之后也是有序的。
【注意】:当MySQL认为查询的数据量超过表中的20%时候,可能就不使用索引了。
ref 代表使用非主键的索引。也是非常好的。
all:代表没有是索引
index:代表直接使用索引获取索引里面的信息。这个只是比ALL好一点点。
最好的 如果出现 system, null 级别最好。
type可能出现的关键字
const 最好的,常量级别,当使用primary key的时候,会出现。
ref 也是使用了索引,但是是非主键索引。
range 代表使用了范围,并且还是需要在小范围内。
index 代表使用索引内的索引数据
all 代表全表扫描,没有索引
如果出现system或者null,代表MySQL优化的最好了
注意:当查询的信息不存在的时候,MySQL也会非常快。因为维持了一张常量表。
手册:
使用细节
等值匹配
范围匹配,小范围
左前缀特性(面试必问)
在执行如下SQL语句:
# select * from tableName where first_name like “%asdas”; 不会使用索引
# select * from tableName where first_name like “a%”; 可以使用索引
# select * from tableName where first_name like “a%b”; 可以使用索引
独立的列
在执行SQL语句的时候,查询字段是不能使用运算符操作,或者函数处理。
# select * from tableName where emp_no+1 = 3;
所以一般把表达式放在等号的右侧执行,这个时候可以使用上索引。
使用场景
面试问题:
什么样的字段适合建立索引?
答:1. 在where条件后面频繁使用的字段适合建立索引。X
正确:一般来说,在where条件后面的字段适合建立索引,并且,在排序、分组的字段后面也可以建立索引。因为索引是排好序的快速查找结构。
# select * from tableName order by emp_no desc limit 10;
MySQL优化一般思路?
答:首先在做MySQL优化的时候,先做一些测试,测试MySQL服务器的一个整体性能(CPU、内存、磁盘读写),需要开启MySQL一个慢查询,运行一段时间(一个星期,一个月不等)
可以通过前面的慢查询把对应SQL语句找出来。在通过profile 可以做一个详细的分析,分析出问题的所在。一般都是在:1. 索引使用不当。独立列 2. 索引本身建的就不合理
解决方案:使用不当的SQL语句做重写的编写。索引建立的不合适的话,就删除之后,新建一个合适的索引。使用一个工具来具体的分析(explain工具)。在重复上面的一个过程,往返的测试。
测试服务器性能
开启慢查询,定位SQL语句
开启profile分析SQL语句
修改SQL语句或者索引
使用explain工具做出分析
重复这个过程
什么是索引覆盖?
在执行select操作的时候,查询的字段正好在索引文件里面出现了,这个时候字段信息可以直接从索引中获取,没有必要冲磁盘上读取。
在使用复合索引(对多个字段建立索引)的时候,需要特别注意: 过河
# alter table tableName add index(first_name,last_name);
简单的说,就是在过河的时候,桥上有你需要的数据,你就可以直接拿到这个数据,然后返回,没必要过河(到磁盘文件获取数据)
对于复合索引来说,必
原创力文档


文档评论(0)