Mysql优化相关

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指定](安全模式启动,数据库将操作写入日志,以备恢复)

索引分类:
主键索引、唯一索引、组合索引、全文索引、普通索引
索引的实现原理: B-tree 折半查找
如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:
实例: alter table 表名 add primary key (列名); --主键索引
删除主键索引: alter table 表名 drop primary key;
普通索引创建:create index 索引名 on 表 (列1,列名2);
组合索引:格式 alter table 表名 index 索引名字(列1,列2,);
1、如果使用组合索引,查询条件使用第一个,不跟第二个一起使用,会使用索引查找,
但是单独使用第二个作为查询条件查询不会使用索引查找
全文索引:(目前企业一般采用第三方搜索引擎框架:solor等)
错误用法:
select * from articles where body like ‘%mysql%’; 错误用法 索引不会生效
正确用法:
select * from articles where match (title,body) against ( ‘database’)

执行计划:
MySql提供了 EXPLAIN 语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。比如我们要分析如下SQL语句:
explain select * from table where table.id = 1

索引的代价:
占用磁盘空间
对DML(update、delete、insert)语句的效率影响
增删改会对索引影响,因为索引要重新整理。

那些列上适合添加索引

查询作为查询条件字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁
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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值