常见的MySQL基本优化方法,由于对数据库方面开发经验较少,所以自己收集一些资料,这里主要是针对索引的一些基本操作。
show命令一些简单用法
1、show status like 'uptime' mysql启动的总时间
2、show status like 'com_select[delete,insert]' 当前查询连接数,删除,添加
3、show status like 'connections' 连接数
4、show status like 'show_queries' 慢查询次数
5、show variables like 'long_query_time' 当前慢查询时间 默认是 10秒,超过10秒被认为是慢查询
set long_query_time = 1 修改慢查询时间,超过1秒被认为是慢查询
慢查询不只是针对查询,添加也会被记录
delimiter $ 作用:将mysql结束符';'换成自定义的符号 这里换成了 '$',一般在写存储过程的时候换成 '$',写存储过程会用到
关于慢日志
如果出现了慢查询,这里如果查询速度超过1秒,就会统计
如何将慢查询的sql语句记录到我们的日志中去,配置如下:
注意:在默认情况下,mysql是不记录慢查询,需要在启动mysql时候指定记录慢查询
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指定]
如果启动了慢查询日志,日志默认记录到配置文件 datadir=目录
索引优化
1、创建索引
1.1主键索引
create table aaa(id int unsigned primary key auto_increment,name varchar(32) not null default '');
id 为主键索引
如果创建表时,没有指定主键索引,也可以在创建表后再添加:
alter table 表名 add primary key(列名)
例子:
create table bbb(
id int,
name varchar(32) not null default ''
);
添加主键 id
alter table bbb add primary key (id);
1.2普通索引
一般来说,先创建表再创建普通索引
例子:
create table ccc(
id int unsigned,
name varchar(32);
);
create index 索引名 on 表名 (列名)
1.3全文索引
使用场景:主要是针对文本的检索,比如文章,全文索引只对MyISAM有效
例子:
create table articles(
id int unsigned primary key auto_increment,
title varchar(200) not null default '',
body text,
fulltext (title,body)
)engine=myisam charset utf8;
insert into articles (title,body) values
('mysql tutorial','DBMS stands for DataBase...'),
('How To Use MySQL Well','AFlter you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Nerver run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When confiqured properly,MySQL ...');
使用全文索引:
错误用法:
select * from articles body like '%mysql%'; //不会使用全文索引
证明:
explain select * from articles where body like '%mysql%';
正确用法:
select * from articles where match(title,body) against('database');
说明:
1、再mysql中 fulltext索引只针对 myisam生效
2、mysql自己提供的fulltext只针对英文字母生效->sphinx(coreseek) 处理中文索引
3、使用方法 match(字段名,字段名...) against('关键字');
4、全文索引有一个叫停止词,在一个文本中创建索引是一个无穷大的数,因此对一些常用的词和字符,就不会去创建,这些词成为,停止词
1.4唯一索引
当表的某列被指定为unique约束时,那么这一列就是一个唯一索引
例子:
create table ddd(id int primary key auto_increment,name varchar(32) unique);
name列就是一个唯一索引
name列是否可以为空null 可以为空而且可以多个,其余的不能重复,包括''空字符串
主键字段,不可以为空null,并且不可以重复
先创建表,再指定唯一索引:
create table eee(id int primary key auto_increment, name varchar(32));
create unique index 索引名 on 表名 (列名);
2、查询索引
Desc 表名 [缺点:不能够查询索引名]
show index(ex) from 表名
show keys from 表名 和上面一样
3、删除索引
alter table 表名 drop index 索引名
删除主键索引 alter table 表名 drop primary key;
4、索引使用注意事项:
索引付出代价,磁盘占用
对 增、删、改 速度会变慢,因为要修改索引中的数据
哪些列适合添加索引:
较频繁作为查询条件
该字段内容有多个,不是唯一的几个
字段内容更新不要太频繁
比如,编号,id
不适合创建索引:
唯一性太差的字段,比如 性别字段,
更新频率非常频繁的字段
不会出现在where子句中的字段
使用索引:
1、对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用
2、对于使用like的查询,查询如果是 '%aaa' 不会使用索引 'aaa%'会使用索引
3、如果条件中有 or ,即使其中有条件带索引也不会使用
4、对于多列索引,不是使用的第一部分,则不会使用索引
5、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。(添加时,字符串必然)
如何选择mysql存储引擎:
myisam: 如果表对事务(回滚)要求不高,同时是以查询为主,考虑使用myisam
比如 bbs中的发帖表,回复表
查询速度较快
支持全文索引
锁表机制
不支持外键
InnoDB: 对事务要求高,保存的数据都是重要数据,我们建议使用InnoDB
比如 订单表,账户表
查询速度较慢
不支持全文索引
行锁机制
支持外键
Memory: 比如我们数据变化非常频繁,不需要入库,同时频繁查询和修改,考虑使用Memory引擎