mysql 优化mysql
1.mysql优化是一个综合性的,主要方向包括
a:表的设计要符合三范式(3NF)
b:添加适当的索引(index)四中常见索引:普通索引、主键索引、惟一索引unique、全文索引
c:分表技术(水平分割、垂直分割)
d:读写(update/delete /add)分离技术
e:存储过程
f:对mysql配置优化(对配置最大并发数修改 my.ini文件 max_connection通常调整到1000左右、调整缓存大小)
g:mysql服务器硬件升级
h:定时清除不须要的数据,定时进行碎片整理(MyISAM存储引擎)sql
2.sql语句自己的优化
问题是:如何从一个大项目中,迅速的定位执行速度慢的语句?定位慢查询
①首相了解mysql数据库的一些运行状态如何查询(好比当前mysql运行的时间/一共执行了多少次select语句/当前链接数等)
show status //显示状态
show [session|global] status like …… //默认是session 指的是取出当前窗口执行的次数
show status like 'com_select' //显示执行了多少次select语句
show status like 'connections' //显示链接数
show status like 'slow_queries' //显示慢查询次数
步骤:①显示mysql的慢查询时间默认值单位是秒
show variables like 'long_query_time'
②修改mysql的慢查询时间默认值
set long_query_time=1数据库
如何启动慢查询日志?记录查询过的慢查询语句
默认状况下mysql不记录慢查询,须要在启动时指定参数
启动mysql的命令: bin\mysql.exe --safe-mode --slow-query--log
生成日志文件在my.ini中的datadir指定的路径下缓存
3.添加索引
1.主键
添加索引
方式a: create table tableName(id int unsigned primary key auto_increment,name varchar(32
not null default '');
方式b: alter table tableName add primary key (列名);
2.普通索引
添加索引
create table tableName (
id int unsigned
name varchar(10) not null default ''
)
create index 索引名 on 表名(列名)安全
3.全文索引
全文索引主要是针对对文本的检索好比文章。
添加索引
create table tableName(
id int unsigned primary key auto_increment,
title varchar(200),
body TEXT,
FULLTEXT(title,body)
)engine=myisam charset utf8;服务器
如何使用全文索引
错误的用法:
select * from tableName where body like '%mysql%';【不会使用全文索引】
正确的使用方法
select * from tableName where match(title,body) against('querycharacter');session
说明:
a.在mysql中fulltext索引只针对myisam生效
b.mysql本身提供的fulltext只针对英文生效,要处理中文可使用sphinx()
c.使用方法是使用match(字段名……)
mysql优化
4.惟一索引
添加索引
方式a: 当表的某列被指定为unique约束时,这就是一个惟一索引
create table tableName(
id int unsinged primary key auto_increment,
name varchar(32) unique
)engine = innodb charset utf8;并发
这是name列就是一个惟一索引,unique字段能够为null,能够多个
方式b:
create table tableName(
id int unsinged primary key auto_increment,
name varchar(32)
)engine = inodb charset utf8;
create unique index 索引名 on 表名(列名)优化
删除索引
alter table tableName drop index indexName
查询索引
show index from tableName
4.索引的注意事项
a.占用磁盘
b.对dml语句有影响,会变慢,由于dml语句会影响btree。
5.什么时候何地添加索引
a.频繁的做为查询条件的字段应该建立索引
b.惟一性太差的字段不适合做为索引,由于构建的btree不优秀,例如性别字段
c.更新很是频繁的字段不适合创建索引,dml语句会重建btree。
d.不出如今where中的字段不该该创建索引
6.应该建立索引总结:
a.确定在where条件中常用,
b.该字段的内容不是惟一的几个值例如gender
c.字段内容不是常常变化的
7.sql语句中使用索引时的注意
a.当sql中使用复合索引时,当条件语句中的字段是复合索引字段最左边的字段就会使用索引
不然不会使用。explain sql语句 能够帮助咱们不真正的执行sql语句,去看mysql的执行计划。从为去
优化sql 状况。
b.对于使用like查询,若是‘%’写在前面,是不会使用索引。非要使用%在前,那就只能不使
用索引,或者使用全文索引sphinx
c.若是条件中有or,使用的全部字段都必须创建索引才能使用索引,不然不会使用索引建议大
家尽可能避免使用or,or的效率不高。
d.若是列是字符串,查询时,使用单引号引发可使用索引,不使用不会使用索引
e.若是mysql发现扫描全表比使用索引快时,就不会使用索引。
8.如何查看索引使用的状况
show status 'handler_read%';
值越高越好
9.经常使用sql优化
a.group by 会对分组的数据作默认排序,当业务不须要排序时,能够把order by null
b.不少时候使用左链接比使用子查询效率要高
10.存储引擎选择
myisam存储:对事务要求不高,同时是以查询和添加为主的。好比评论回复表
INNODB存储:对事务要求高,保存数据重要。好比订单表,帐号表
Memory存储:好比咱们数据变化频繁,不须要入库,同事有频繁的查询修改。
11.myisam和innodb的区别
myisam innodb
批量插入 高 低
事务安全 不支持 支持
全文索引 支持 (5.5以后)支持
锁机制 表锁 行锁
外键 不支持 支持
12.碎片整理
若是数据库引擎是myisam的须要定时作碎片整理。
例如:
create table tableName (
id int unsigned primary key auto_increment,
name varchar(100) not null default ''
)engine=myisam charset utf8;
insert into tableName values('aaa');
delete from tableName where id = 1;
使用delete语句并无真实删除数据,在这种状况下,咱们应该定时对myisam进行整理。
命令:optimize table tableName;
题外话,技术就是窗户纸,捅破了,就简单了,因此要常常与大神交流,为此,我辞职了……
13.数据库备份
a.手动备份
cmd控制台 mysqldump -u root -proot 数据库[表名1,表名2……] >文件路径
mysqldump -u root -proot temp >d:\temp.bak
若是但愿备份的是数据库的某几张表
b.自动备份
把备份数据库的指令写入到bat文件里,而后经过任务调度器定时调用bat文件
c.使用备份文件恢复数据
mysql 控制台 source 备份文件路径 例如 source d:\temp.dept.bak
14.mysql配置文件优化
修改 a.端口号 b.最大链接数通常1000 c.innodb的缓存(通常扩大10倍)innodb_addition_mem_pool_size=64M innodb_buffer_pool_size=1G,对于myisam,须要调整key_buffer_size。