专题《一》 mysql优化

从今天开始,在这里记录面试会问的问题,针对java高级开发,架构师方向。

 

1.数据库设计要合理。开发经验不同  设计表水平不同  影响后面操作

  三范式:1------------原子约束,每列不可分割                           具体看业务,比如地址

      2------------主键唯一

      3------------不要有冗余数据

 

 

2.添加索引(普通   index,主键   primary·,唯一  unsigned,全文,

      组合索引   alter table dept add index my_ind (dname,loc); )                                 mysql优化,重点索引优化

 折半查询

mysql----mysql  server5.5----data---数据库名---每个数据库有      MYD表数据     MYI索引文件    frm表结构   三个文件

 

底层:b+树               将索引排列成树的结构。   选取一个中间数,小的总是在左边,大的总是在右边

    2的n次方查找速度。    比如2的5次方个数据,只需要查找5次。

 

缺点:增加,删除,索引文件需要更新。

 

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。比如我们要分析如下SQL语句:

explain select * from table where table.id = 1 

运行上面的sql语句后你会看到,下面的表头信息:

table | type | possible_keys | key | key_len | ref | rows | Extra

 

总结:满足一下条件的字段,才应该创建索引

①  肯定在where条件经常使用

②  该字段的内容不是唯一的几个值

③  字段内容不是频繁变化

 

实际企业中不会使用全文索引:

 第三方搜索引擎框架:es,slor

 

3.分表分库(分表:减轻单张表压力   分库:根据项目分库)

分表:根据年限,尾数,     取模根据尾数

 

 

4.读写分离

 篇幅较多,在下一篇阐述

 

 

5.存储过程   ( 就是一块sql语句,提升执行效率,但是灵活性不高)

 

6.配置mysql最大连接数

 

7.mysql服务器硬件升级

 

8.随时清理碎片化

 

9.sql语句调优

 

①  使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,

在group by 后面增加 order by null 就可以防止排序.

explain select * from emp  group by deptno order by null;

②  有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

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

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

 

 

③  对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

应尽量避免在 where 子句中对字段进行 null 值判断

 

模糊查询在like前面有百分号开头会失效。

 

如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字

 

 

 

 

10.定位慢查询

 mysql默认慢查询10s

//显示慢查询次数

show status like 'slow_queries';

--查询慢查询时间

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

 

 

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

 

先关闭mysql,再启动, 如果启用了慢查询日志,默认把这个文件放在

 

 

my.ini 文件中记录的位置:

 

#Path to the database root

 

datadir=" C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

 

 

mysql存储引擎

inndb(主流),        ------------事务机制

myisam,

memory

 

MyISAM 和 INNODB的区别

1. 事务安全(MyISAM不支持事务,INNODB支持事务)

2. 查询和添加速度(MyISAM批量插入速度快)

3. 支持全文索引(MyISAM支持全文索引,INNODB不支持全文索引)

4. 锁机制(MyISAM时表锁,innodb是行锁)

5. 外键 MyISAM 不支持外键, INNODB支持外键. (在PHP开发中,通常不设置外键,通常是在程序中保证数据的一致)

Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快. (如果mysql重启的话,数据就不存在了)

 

如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理:具体表现为清除数据后,myd文件大小不会减小

 

posted @ 2019-03-17 23:22  M号开发者  阅读(184)  评论(0编辑  收藏  举报