目录
数据库调优
- 创建索引:创建合适的索引,我们就可以现在索引中查询,查询到以后直接找对应的记录。
- 分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化
- 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群。
- 缓存:使用redis来进行缓存
- 一些常用优化技巧
选择合适的存储引擎
MyISAM存储引擎:如果表对事务要求不高,同时是以查询和添加为主的,比如 bbs 中的 发帖表,回复表.
INNODB存储引擎: 对事务要求高,保存的数据都是重要数据,:如订单表,账号表.
Memory 存储:我们数据变化频繁,不需要入库,同时又频繁的查询和修改,考虑使用memory, 速度极快;
MyISAM 和 INNODB的区别(主要)
1. 事务安全 myisam不支持事务而innodb支持
2. myisam不用支持事务就不考虑同步锁,查找和添加速度快
3. 支持全文索引 myisam支持innodb不支持
4. 锁机制 myisam支持表锁而innodb支持行锁(事务)
5. 外键 MyISAM 不支持外键, INNODB支持外键. (通常不设置外键,通常是在程序中保证数据的一致)
数据库优化之创建合适的索引
分类:普通索引/唯一索引/主键索引/全文索引
普通索引:允许重复的值出现
唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名、用户身份证、email,tel)
主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会給改列创建索引。这就是主键索引.唯一且没有null值
全文索引:用来对表中的文本域(char,varchar,text)进行索引, 全文索引针对MyIsam
explain select * from articles where match(title,body) against(‘database’);【会使用全文索引】
sql语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致索引无效进行全表扫描
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将导致索引无效进行全表扫描
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致索引无效进行全表扫描
5.in 和 not in 也会导致全表扫描,能用 between 就不要用 in 了
6.应尽量避免在 where 子句中对字段进行表达式操作,否则将导致索引无效进行全表扫描
7. 对于使用like的查询,查询如果是’%aaa’不会使用到索引而‘aaa%’会使用到索引
8.应尽量避免在where子句中对字段进行函数操作,否则将导致索引无效进行全表扫描
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.很多时候用 exists 代替 in 是一个好的选择:
11.一个表的索引数最好不要超过6个
12.尽量使用数字型字段
13.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些
14.不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段
15.避免频繁创建和删除临时表,以减少系统表资源的消耗。
16.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但对于一次性事件,最好使用导出表。
17.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
18.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
19.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
20.尽量避免大事务操作,提高系统并发能力。
21.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
经典面试题 之 SQL优化_sql优化面试题_好好学习,天天上当!的博客-CSDN博客
数据库优化之分表
分表分为水平(按行)分表和垂直(按列)分表
根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉;水平分表能够很大程度较少这些压力。
按行数据进行分表:如果一张表中某个字段值非常多(长文本、二进制等),但只有在很少的情况下会查询。这时就可以把字段多个单独放到一个表,通过外键关联起来。
水平分表策略:
1.按时间分表
这种分表方式有一定的局限性,当数据有较强的实效性,如微博发送记录、微信消息记录等,这种数据很少有用户会查询几个月前的数据,就可以按月分表。
2.按区间范围分表
一般在有严格的自增id需求上,如按照user_id水平分表:
table_1 user_id从1~100w table_2 user_id从101~200w
3.hash分表
通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。
Mysql和oracle区别
1、本质的区别
Oracle数据库是一个对象关系数据库管理系统,是一个收费的数据库。
MySQL是一个开源的关系数据库管理系统,它是一个开源、免费的数据库。
2、数据库安全性
MySQL使用三个参数来验证用户,即用户名,密码和位置;Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。
3、SQL语法的区别
Oracl更灵活,如mysql用limit分页,oracle用rownum。
4、存储上的区别:
与Oracle相比,MySQL没有表空间,角色管理,快照,同义词和包及自动存储管理。
5、对象名称的区别:
Oracle对所有对象名称都不区分大小写;而某些MySQL对象名称(如数据库和表)区分大小写(取决于底层操作系统)。
6、运行程序和外部程序支持:
Oracle数据库支持从数据库内部编写,编译和执行的几种编程语言。此外,为了传输数据,Oracle数据库使用XML。
MySQL不支持在系统内执行其他语言,也不支持XML。
7、MySQL和Oracle的字符数据类型比较:
MySQL具有CHAR和VARCHAR。而,Oracle支持CHAR,NCHAR,VARCHAR2和NVARCHAR2
8.mysql事务自动提交,oracle需要手动提交
9、临时表的区别:
Oracle和MySQL以不同方式处理临时表。
在MySQL中,临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。
Oracle中临时表的定义与MySQL略有不同,因为临时表一旦创建就会存在,直到它们被显式删除,并且对具有适当权限的所有会话都可见。但是,临时表中的数据仅对将数据插入表中的用户会话可见,并且数据可能在事务或用户会话期间持续存在。
1、主键的使用:
MySQL:一般使用自动增长类型,主键会自动增长;
Oracle:没有自动增长,主键一般使用序列,插入记录时将序列号的下一值付给该字段即可。
3、模糊查询的比较
MySQL:用字段名like%‘字符串%’
Oracle:也可以用字段名like%'字符串%'但这种方法不能使用索引,用字符串比较函数isnert(字段名,‘字符串’)>0会得到更精确的查找结果。
4、空字符串的比较:
MySQL的非空字段也有空的内容,Oracle里定义了非空字段就不容许有空的内容。按MySQL的not null来定义Oracle表结构。
导数据的时候就会产生错误。因此导数据时对空字符进行判断,如果为Null或空字符,需要把它改成一个空格的字符串。
- 单引号的处理MySQL双引号,Oracle里只可用单引号。
Oracle与MySQL的区别 以及优缺点_oracle和mysql的区别和优缺点_小白爱喝可乐的博客-CSDN博客
Mysql主键索引和非主键索引在索引树上的实现有什么区别
mysql的Innodb引擎中,主键索引和普通索引的工作原理是什么? - 知乎
mysql原子性依托那些系统日志实现的
隔离性 ------------------- 通过锁实现
原子性、持久性-------- 通过 redo log(重做日志)实现 。
一致性 ------------------- 通过 undo log(回滚日志)实现
MySQL系统日志有哪些?
MySQL - 日志系统_mysql 日志系统_没对象的指针的博客-CSDN博客
mysql为什么使用b+树
Mysql--索引_叶子节点和非叶子节点区别_子夜听雨的博客-CSDN博客
Mysql语句底层执行流程
MySQL5.7和MySQL8.0的区别
MySQL5.7和MySQL8.0的区别是什么_mysql8和mysql5.7的区别_简单点了的博客-CSDN博客
MyBatis的实现逻辑
MyBatis 面试题(附答案解析)_mybatis面试_java领域的博客-CSDN博客
Mybatis获取插入数据后的主键的值
mybatis提供的useGeneratedKeys和keyProperty属性,keyProperty属性绑定java实体类中的属性,useGeneratedKeys设置为true即可