MySQL如何优化
表的设计合理化(符合3NF)
添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
SQL语句优化
分表技术(水平分割、垂直分割)
读写[写: update/delete/add]分离
存储过程 [模块化编程,可以提高速度]
对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
mysql服务器硬件升级
定时的去清除不需要的数据,定时进行碎片整理(MyISAM)
数据库三大范式
第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
第二范式:2NF是对记录的唯一性约束,表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现,主键不能包含业务逻辑。
第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。
但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
看你的mysql现在已提供什么存储引擎:
mysql> show engines;
看你的mysql当前默认的存储引擎:
mysql> show variables like ‘%storage_engine%’;
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;
如何查看Mysql服务器上的版本
select version();
SQL优化
如何从一个大项目中,迅速的定位执行速度慢的语句. (定位慢查询)
show status
使用show status使用show status查看MySQL服务器状态信息
常用命令
–mysql数据库启动了多少时间
show status like ‘uptime’;
show stauts like ‘com_select’ show stauts like ‘com_insert’ …类推 update delete(显示数据库的查询,更新,添加,删除的次数)
show [session|global] status like … 如果你不写 [session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该 global)
//显示到mysql数据库的连接数
show status like 'connections ';
//显示慢查询次数
show status like ‘slow_queries’;
慢查询
什么是慢查询
MySQL默认10秒内没有响应SQL结果,则为慢查询
可以去修改MySQL慢查询默认时间
如何修改慢查询
–查询慢查询时间
show variables like ‘long_query_time’;
–修改慢查询时间
set long_query_time=1; —但是重启mysql之后,long_query_time依然是my.ini中的值
如何将慢查询定位到日志中
在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以
bin\mysqld.exe --safe-mode --slow-query-log [mysql5.5 可以在my.ini指定](安全模式启动,数据库将操作写入日志,以备恢复)
那些列上适合添加索引
查询作为查询条件字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁
Select * from emp where sex=’男’
频繁更新字段,也不要定义索引。
不会出现在where语句的字段不要创建索引
总结:满处一下条件的字段,才应该创建索引
① 肯定在where条件经常使用
② 该字段的内容不是唯一的几个值
③ 字段内容不是频繁变化
常见的Mysql优化:
1、条件加like的效果
使用索引的时候,不要like '% %'否则全表扫描
使用like 时,去掉开头的 %,会进行全表扫描
2、使用or 条件都必须加上索引,只要有一个条件不加索引,则不会使用索引查找
3、判断 是否为null, 使用 is null,不要使用 =null
4、group by 分组不会使用索引,全表扫描
5、分组需要效率高,禁止排序, 使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,
在group by 后面增加 order by null 就可以防止排序.
6、select * from user where id>=100 select * from user where id>100 ;
不要使用 >=
7、 in 、 not in 尽量不要使用,就算加了索引,索引还是会失效的,可以采用 exists
8、查询数据量比较大的时候,使用缓存、分表、分页
Mysql的存储引擎:
使用的存储引擎 myisam / innodb/ memory
主流的存储引擎:innodb --事物机制
innodb 与 myisam 的区别?
1、批量添加 --使用 myisam 效率高
2、innodb --事物机制非常安全
3、锁机制:myisam (表锁),innodb (行锁)
4、数据结构 myisam --支持全文检索
5、都支持 b-tree数据结构
6、都支持索引缓存
如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理
举例说明:
create table test100(id int unsigned ,name varchar(32))engine=myisam;
insert into test100 values(1,’aaaaa’);
insert into test100 values(2,’bbbb’);
insert into test100 values(3,’ccccc’);
insert into test100 select id,name from test100;
我们应该定义对myisam进行整理
optimize table test100;