山山未迟

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

image

image

 

目录

一、mysql优化概述 1

二、分析需要优化的语句 1

1、使用mysql里面的 慢查询日志, 1

2、使用profiles机制 3

三、索引 4

1、索引 的类型 4

2、如何创建索引 4

3、删除索引 5

4、查询索引: 5

5、创建索引的注意事项 5

四、索引结构 6

五、explain(执行计划)工具的使用 7

六、使用执行计划,完成sql语句索引执行情况查询; 8

1、多列索引: 8

2、对于使用like的查询,查询如果是”%aaa”,不会使用到索引,‘aaa%’会使用到索引。 10

3、如果条件中有or,则要求or的索引字段都必须有索引,否则不能用到索引。 11

4、如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。 12

5、优化group by语句。 12

6、当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。 13

七、索引覆盖 14

八、前缀索引, 14

九、翻页优化 15

十、碎片整理 17

十一、锁机制讲解 18

1、表锁的演示: 19

2、行锁的演示: 21

十二、分区分表技术 21

1、分区类型: 22

一、mysql优化概述

页面静态化的内容,memcache,减少数据库的访问,提高网站的访问速度,无论如何优化,还是要操作数据库的,要从数据库的角度来优化,提高访问速度。

设计角度:存储引擎的选择,字段类型选择,范式

利用mysql自身的特性:索引,查询缓存,分区分表,存储过程,sql语句优化配置,

部署大负载架构体系:主从复制,读写分离。

硬件升级:

二、分析需要优化的语句

要 查找执行速度比较慢的sql语句,

1、使用mysql里面的 慢查询日志,

慢查询日志,是由mysql提供的,用于记录sql执行时间超过了某个时间界限,该时间界限我们可以自己设定,比如我们设定的时间界限为0.5秒,开启慢查询日志后,会自动记录执行时间超过0.5秒的sql语句。慢查询日志默认没有开启,默认的时间界限是10秒。

(1)如何开启慢查询日志,

方式一:打开mysql的配置文件,my.ini,添加如下语句:修改完成后,要重启mysql服务。

wpsA220.tmpwpsA231.tmpwpsA232.tmpwpsA233.tmpwpsA253.tmp

wpsA254.tmpwpsA265.tmpwpsA275.tmp

(2)开始测试,是否记录执行时间超过0.5秒 的sql语句。

select benchmark(执行次数,表达式);

wpsA286.tmp

在慢查询日志文件里面查看是否记录:

wpsA296.tmp

(3)相关的一些命令,

查看慢查询日志的时间界限

wpsA297.tmp

可以在当前会话中进行修改慢查询的时间界限:

语法:set long_query_time=时间界限

wpsA2A8.tmp

2、使用profiles机制

该机制开启后,会记录每个sql语句的执行时间,精确到小数点后8位。

如果开启:set profiling=1|0      值为1则是开启,为0则是关闭。

查看sql语句的执行时间:show profiles

wpsA2B9.tmp

一般sql语句执行比较慢,原因是没有添加索引,

没有添加索引之前:

wpsA2C9.tmp

添加索引之后使用的时间:

wpsA2DA.tmp

三、索引

索引:利用字段的某些属性,快速 的定位数据(磁盘,柱面,磁道,扇区)

1、索引 的类型

唯一索引(unique key):字段数据是唯一的,数据内容里面能否为null,在一张表里面,是可以添加多个唯一索引。

主键索引(primary key ):数据记录里面不能有null,数据内容不能重复,在一张表里面不能有多个主键索引。

普通索引(index ):使用字段关键字建立的索引,主要是提高查询速度。

全文索引(fulltext index):在比较老的版本中,只有myisam引擎支持全文索引,在最新的版本中(可能是mysql.5.6)innodb引擎也支持全文索引,在mysql中全文索引不支持中文。

2、如何创建索引

(1)在创建表的时候,同时创建索引,

create table stu(

id int primary key auto_increment,

name varchar(32) not null,

age tinyint unsigned not null,

email varchar(32) not null,

intro text,

unique key (name),

index (email),

fulltext index (intro)

)engine myisam charset utf8;

(2)在修改表的时候,添加索引

create table stu1(

id int primary key auto_increment,

name varchar(32) not null,

age tinyint unsigned not null,

email varchar(32) not null,

    intro text

)engine myisam charset utf8;

alter table stu1 add unique key (name), add index (email), add fulltext index (intro);

3、删除索引

主键索引的删除,在删除主键 索引时,要删除到auto_increment属性,

alter table 表名  drop primary key

普通索引的删除:alter table 表名  drop index 索引名称 (如果索引名称没有指定则是索引的字段名称)

删除唯一索引:alter table 表名 drop index 索引名称

4、查询索引:

show index from 表名

show indexes from  表名

desc 表名,

show create table 表名

5、创建索引的注意事项

(1)较频繁的作为查询条件字段应该创建索引

select * from emp where empno = 1

唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

select * from emp where sex = '男‘

更新非常频繁的字段不适合创建索引

select * from emp where logincount = 1

(2)不会出现在WHERE子句中字段不该创建索

四、索引结构

查看索引的类型,是BTREE结构。

wpsA2EB.tmp

myisam引擎的索引的结构

该引擎的表是有三个文件组成的。一个是frm(存储结构)myd(数据) myi(索引)

wpsA2FB.tmp

wpsA30C.tmp

innodb索引的索引结构,innodb的索引叫聚簇索引。

innodb的主索引文件上 直接存放该行数据,称为聚簇索引,非主索引指向对主键的引用

wpsA32C.tmp

注意: innodb来说,

1: 主键索引 既存储索引值,又在叶子中存储行的数据

2: 如果没有主键, 则会Unique key做主键

3: 如果没有unique,则系统生成一个内部的rowid做主键.

4: 像innodb中,主键的索引结构中,既存储了主键值,又存储了行数据,这种结构称为”聚簇索引”

在插入大量的数据的时候,造成频繁的页分裂.

五、explain(执行计划)工具的使用

主要用于分析sql语句的执行情况(并不执行sql语句)得到sql语句是否使用了索引,使用了哪些索引

语法:explain  sql语句\G   或 desc sql语句\G

在mysql之前的版本中,explain只支持select语句,但是在最新的5.6版本中,它支持 explain update/delete了。

建表完成测试:

create table user(

    id int primary key auto_increment,

    name varchar(32) not null default '',

    age tinyint unsigned not null default 0,

    email varchar(32) not null default '',

    classid int not null default 1

)engine myisam charset utf8;

insert into user values(null,'xiaogang',12,'gang@sohu.com',4),

(null,'xiaohong',13,'hong@sohu.com',2),

(null,'xiaolong',31,'long@sohu.com',2),

(null,'xiaofeng',22,'feng@sohu.com',3),

(null,'xiaogui',42,'gui@sohu.com',3);

创建一个班级表:

create table class(

    id int not null default 0,

    classname varchar(32) not null default ''

)engine myisam charset utf8;

insert into class values(1,'java'),(2,'.net'),(3,'php'),(4,'c++'),(5,'ios');

wpsA33D.tmpwpsA33E.tmpwpsA33F.tmpwpsA340.tmpwpsA350.tmpwpsA351.tmpwpsA352.tmpwpsA353.tmpwpsA364.tmpwpsA365.tmpwpsA376.tmpwpsA377.tmpwpsA3B6.tmp

六、使用执行计划,完成sql语句索引执行情况查询;

复合索引,有多列组合成一个索引。比如如下,建立一个name和age的一个复合索引。

mysql> alter table user add index (name,age);

Query OK, 5 rows affected (0.05 sec)

Records: 5  Duplicates: 0  Warnings: 0

1、多列索引:

(1)对于创建的多列(复合)索引,只要查询条件使用了最左边的列,索引一般就会被使用

因为组合索引是需要按顺序执行的,比如c1234组合索引,要想在c2上使用索引,必须先在c1上使用索引,要想在c3上使用索引,必须先在c2上使用索引,依此。

wpsA3F6.tmp

2、对于使用like的查询,查询如果是”%aaa”,不会使用到索引,‘aaa%’会使用到索引。

wpsA454.tmp

比如:根据电影的剧情查找电影的名称,根据歌词查找歌名。like ‘%爱请%’

可以使用第三方查询工具,sphinx

3、如果条件中有or,则要求or的索引字段都必须有索引,否则不能用到索引。

wpsA465.tmpwpsA466.tmpwpsA496.tmp

4、如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。

wpsA4B6.tmp

5、优化group by语句。

默认情况下, mysql对所有的group by col1,col2进行排序。这与在查询中指定order by col1,col2类型,如果查询中包括group by 但用户想要避免排序结果的消耗,则可以使用order by null禁止排序。

wpsA4D6.tmp

6、当取出的数据量超过表中数据的80%,优化器就不会使用索引,而是全表扫描。

wpsA506.tmp

posted on 2016-05-08 21:31  山山未迟  阅读(215)  评论(0编辑  收藏  举报