mysql优化

mysql优化时一个综合性的技术,主要包括

  • 表的设计合理化(符合3NF)
  • 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
  • 分表技术(水平分割、垂直分割)
  • 读写[写: update/delete/add]分离
  • 存储过程 [模块化编程,可以提高速度]
  • 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
  • mysql服务器硬件升级
  • 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

Sql语句优化

定位慢查询 show status like ‘slow_queries‘;

把慢查询的sql记录到我们的一个日志中

bin\mysqld.exe - -safe-mode - -slow-query-log [mysql5.5 可以在my.ini指定]

bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

索引技术

主键索引

create table aaa (id int unsigned primary key auto_increment );

alter table 表名 add primary key (列名);

普通索引

create index 索引名 on 表 (列1,列名2);

全文索引

CREATE TABLE articles (id INT , title VARCHAR(200), body TEXT,
FULLTEXT(title,body))engine=myisam charset utf8;

select * from articles where match(title,body) against(‘database’);

注意

  • 在mysql中fulltext 索引只针对 myisam生效
  • mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
  • 使用方法是 match(字段名..) against(‘关键字’)
  • 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.

唯一索引

create table ddd(id int primary key auto_increment , name varchar(32) unique);

create unique index 索引名 on 表名 (列表..);

查、删、改索引

show index(es) from 表名
show keys from 表名

alter table 表名 drop index 索引名;
alter table 表名 drop primary key

索引的弊端

  • 占用磁盘空间
  • 对DML语句有影响
  • 哪些列适合加索引
    • 为频繁的作为where查询条件的字段加索引
    • 唯一性太差的字段不要加索引,比如性别
    • 更新频繁的字段不要加上索引
    • 不会出现在where子句中的字段不要加索引

使用索引的注意事项

  1. 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
    explain select * from dept where loc='aaa'就不会使用到索引
  2. 对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引‘aaa%’ 会使用到索引。
    如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.
  3. 如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字
  4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’), 也就是,如果列是字符串类型,就一定要用 ‘’ 把他包括起来.
  5. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

如何查看索引使用的情况:

show status like ‘Handler_read%’;

handler_read_key这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next这个值越高,说明查询低效。

sql语句的小技巧

  1. 在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度.在group by 后面增加 order by null 就可以防止排序.
  2. 有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式]

select * from dept left join emp on dept.deptno=emp.deptno; [左外连接,更ok!]

如何选择mysql的存储引擎

在开发中,我们经常使用的存储引擎 myisam / innodb/ memory

  1. myisam 存储: 如果表对事务要求不高,同时是以查询和添加为主的,
    我们考虑使用myisam存储引擎. ,比如 bbs 中的 发帖表,回复表.

  2. INNODB 存储: 对事务要求高,保存的数据都是重要数据,
    我们建议使用INNODB,比如订单表,账号表.

  3. Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,
    我们考虑使用memory, 速度极快.

MyISAM 和 INNODB的区别

存储引擎

  1. INNODB事务安全
  2. MYISAM查询和添加速度快 INNODB慢,因为MyISAM直接在最后插数据,
    而INNODB会先稍微排序然后再插入
  3. MyISAM全文索引 INNODB不支持
  4. MyISAM表锁 INNODB行锁
  5. 外键 MyISAM 不支持外键, INNODB支持外键.

如果存储引擎是myisam,要定时进行碎片整理

optimize table tablexxxx;

手动备份数据库(表的)方法

cmd控制台:
比如: 把temp数据库备份到 d:\temp.bak

mysqldump –u root –proot temp > d:\temp.bak

如果你希望备份是,数据库的某几张表

mysqldump –u root –prot temp dept > d:\temp.dept.bak

如何使用备份文件恢复我们的数据.

mysql控制台
source d:\temp.dept.bak

分表技术

分表技术有(水平分割和垂直分割)

水平分割

当一张越来越大时候,即使添加索引还慢的话,我们可以使用分表
以qq用户表来具体的说明一下分表的操作.
首先我创建三张表 user0 / user1 /user2 , 然后我再创建 uuid表,
该表的作用就是提供自增的id,

思考: 如果我们做的是一个平安保险公司的一个订单(8999999999000000条)查询功能
,如何处理海量表?->按时间.

  1. 分表的标准是依赖业务逻辑(时间/地区/….)

  2. 安装字符不同. a-z

  3. 我们给用户提供的查询界面一定是有条件,不能让用户进行大范围.(世界),
    如果需要的可以根据不同的规则,对应多套分表.

  4. 检索时候,带分页条件,减少返回的数据.

  5. 项目中,灵活的根据需求来考虑.

垂直分割

一句话: 如果一张表某个字段,信息量大,但是我们很少查询,
则可以考虑把这些字段,单独的放入到一张表中,这种方式称为垂直分割.

增量备份

  1. 增量备份会记录dml语句,创建表的语句,不会记录select
  2. 记录操作语句本身,操作的时间,操作的位置

步骤

  1. 配置my.ini文件或者my.conf启用二进制备份
    log-bin=d:/binlog/mylog

  2. 启动mysql得到文件
    d:/binlog/mylog/mylog.index 索引文件,有哪些增量备份文件
    d:/binlog/mylog/mylog.00001 存放用户对数据库操作的文件

  3. 备份指令

    mysqlbinlog --stop-datatime="2013-" d:d:/binlog/mylog/mylog.00001| <br />mysql -uroot -p

    mysqlbinlog --start-datatime="2013-" d:d:/binlog/mylog/mylog.00001| <br />mysql -uroot -p

    mysqlbinlog --start-position="12345" d:d:/binlog/mylog/mylog.00001| <br />mysql -uroot -p

    mysqlbinlog --stop-position="22345" d:d:/binlog/mylog/mylog.00001| <br />mysql -uroot -p

    mysqlbinlog --start-position="12345" --stop-position="22345" d:d:/binlog/mylog/mylog.00001| mysql -uroot -p

  4. 可以使用mysql/bin/mysqlbinlog 来查看备份文件内容
    cmd>mysqlbinlog d:/binlog/mylog/mylog.00001

  5. 每周做个全备份(mysqldump) 启用增量备份(把过期时间设为大于等于7)

你可能感兴趣的:(mysql优化)