Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1346980
  • 博文数量: 243
  • 博客积分: 888
  • 博客等级: 准尉
  • 技术积分: 2955
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 14:33
个人简介

漫漫长路,其修远兮!

文章分类

全部博文(243)

文章存档

2017年(2)

2016年(22)

2015年(32)

2014年(57)

2013年(107)

2012年(23)

分类: Mysql/postgreSQL

2013-02-27 20:13:25

1.开销的指标

a.执行时间

b.检查的行数

c.返回的行数

在explain中的type列,访问类型包括全表扫描(full table scan),索引扫描(index scan),范围扫描(range scan),唯一索引查找(unique index lookup)和常量(constant),访问速度依次递增。

type有哪些类型

system:表中只有一行记录,是const表连接类型的一个特例

const:用于PK,UK,索引右边一般是常量,没有表的关联

eq_ref:PK,uk和别的表做关联

ref:非PK,UK索引做关联

ref_or_null:类似ref

unique_subquery:in子查询,子查询中是唯一索引

index_subquery:类似unique_subquery,子查询中是一般索引

range:range用于将某个字段和一个定植用以下任何操作符比较时 =, <>, >,>=, <, <=, is null, <=>, between

index:连接类型跟 all 一样,不同的是它只扫描索引树。它通常会比 all快点,因为索引文件通常比数据文件小(不是使用索引的意思,是扫描索引树的意思)

all:表扫描

2.三种使用where 的情况,从最好到最差依次是

a.对索引查找使用where子句来消除不匹配的行,发生在存储引擎层

b.使用覆盖索引(extra列是using index)来避免访问行,并且从索引取得数据后过滤不匹配的行,发生的服务器层,但是不需要从表中读取行

c.从表中检索出数据,然后过滤掉不匹配的行(在extra列中显示using where),这发生在服务器端,并且要在过滤之前读取这些行

3.查询状态

总共有12种

休眠

线程正在等待客服端的新查询

查询

线程正在执行查询或者往客服端发送数据

锁定

分析和统计

线程正在检查存储引擎的统计信息并且优化查询

拷贝到磁盘的临时表

排序结果

线程正在对结果排序

发送数据

有多个含义,也许是在查询的各个状态之间传递数据,也可能是传递结果,还有可能是把结果返回给客服端

4.查询优化器

mysql是使用的基于cost的优化器,但是优化器并不能总是选择最好的方案。

5.mysql能够处理的一些优化类型

a.对联接中表的顺序重新排序

b.将外连接转换成内连接

c.代数等价法则

d.优化in(),对in里面的数据进行排序,然后用二分查找某个值是否存在,不同于一般的其他数据库把in()看做是多个or的同义词

e.mysql联接执行策略

把每个查询看成一个联接---->把每个联接看成一个嵌套循环----->嵌套循环联接

mysql把所有的查询都转换成联接来执行

f.排序优化

如果待排序值的数量和排序缓存的大小相当,mysql就可以在内存中利用快速排序对所有数据完成排序。

排序算法

双路排序:读取行指针和order by列,对他们进行排序,在重新从表中读取相应的行输出。需要二次读取数据

单路排序:一次取出所有列对他们进行排序

extra显示(using filesort):order by 只引用了联接中的第一个表

extra显示(using temporary,using filesort):order by 引用了二个表的列

5.优化特定类型的查询

优化count

count(列名):统计栏位值的数量

count(*):不会把通配符*展开所有列,直接忽略所有列统计行数

对应myisam引擎,无where条件的count(*) 会比较快,因为有保存表的行数量

 

 

 

 

阅读(1332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~