从今天开始,在这里记录面试会问的问题,针对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时候,指定记录慢查询才可以
binmysqld.exe --safe-mode --slow-query-log [mysql5.5 可以在my.ini指定](安全模式启动,数据库将操作写入日志,以备恢复)
binmysqld.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文件大小不会减小