数据库优化方案
来源:互联网 发布:电话假号软件 编辑:程序博客网 时间:2024/05/20 00:11
一、sql语句优化和索引优化
参考文章:http://www.cnblogs.com/tangyanbo/p/4462734.html
https://tech.meituan.com/mysql-index.html
http://www.jizhuomi.com/wap.asp?act=View&id=315
1.mysql嵌套子查询效率确实比较低,如下面sql语句,查询时间需要30248.271s。
select * from Student s where s.id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )
mysql是先执行外层查询,再执行里层的查询。
2.可以将其优化成连接查询
CREATE index sc_c_id_index on SC(c_id);
CREATE index sc_score_index on SC(score);
SELECT * from Student s INNER JOIN SC sc on sc.s_id = s.id where sc.c_id=0 and sc.score=100
3.连接表时,可以先用where条件对表进行过滤,然后做表连接,在用where条件过滤时,先对其中的字段建立索引
(mysql会对连表语句做优化)
4.建立合适的索引,必要时建立多列联合索引(最左前缀匹配)
在大数据量的情况下,若建立单列索引区分度不高,可以考虑多列联合索引。
5.学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要
下面是一些优化总结:
1. 列类型尽量定义成数值类型,且长度尽可能短(列长度越短,B+树高度越低,减少磁盘IO次数)
2. 建立单列索引
3. 根据需要建立多列联合索引
当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低,
那么如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
4. 根据业务场景建立覆盖索引(如果一个索引包含,或者说覆盖所有需要查询的字段的值,我们就称之为”覆盖索引”)
只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率
5. 多表连接的字段上需要建立索引
这样可以极大的提高表连接的效率
6. where条件字段上需要建立索引
7. 排序字段上需要建立索引
8. 分组字段上需要建立索引
9. where条件字段上不要使用运算、函数,以免索引失效
二、缓存
三、主从复制与读写分离
主从复制过程:
读写分离:
四、分区表
1.全量扫描数据,不要任何索引
通过分区表表达式将数据定位在少量的分区表,然后正常访问这些分区表的数据
2.分离热点,索引数据
将热点数据分离出来在一个小的分区,并对分区建立索引,对热点数据的查询提高效率.
五、垂直切分
垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,应用中配置多个数据源或者使用中间件来访问拆分后的多个库。
存在的问题:
1、跨库join
通过使用字段冗余方法来解决,这是一种典型的反范式设计,在互联网行业中比较常见,通常是为了性能来避免join查询。举个电商业务中很简单的场景:“订单表”中保存“卖家Id”的同时,将卖家的“Name”字段也冗余,这样查询订单详情的时候就不需要再去查询“卖家用户表”。字段冗余能带来便利,是一种“空间换时间”的体现。
2、分布式事务
使用分布式事务,innoDB存储引擎事务隔离级别必须设置为SERIAlIZABLE。
Java的JTA可以支持MySQL的分布式事务
3、存在单库性能瓶颈
六、水平拆分
- 数据库的优化方案
- 数据库优化方案
- K3数据库优化方案
- 数据库优化方案
- 数据库优化方案
- 数据库查询优化方案
- 数据库优化方案
- Oracle数据库优化方案
- 数据库优化方案
- 数据库优化方案整理
- 数据库优化方案整理
- 数据库优化方案
- 数据库优化方案
- 数据库设计优化方案
- 数据库优化方案
- db2数据库优化方案
- 数据库优化方案(一)
- 数据库的优化方案
- 设计模式的分类以及六大设计原则
- laravel 数据填充
- K3对外通讯端口介绍及防火墙端口开放策略
- R语言中的循环函数(Apply)
- 通过SourceTree连接SSL有问题的自建gitlab服务器
- 数据库优化方案
- javabean使用之一
- libstdc++.so.6: version `CXXABI_1.3.9' not found
- Tensorflow中图像翻转函数
- ubuntu16配置ftp
- 51nod1081---子段求和(51nod基础:前缀和)
- 同一端口监听tcp和udp请求
- 题目1057:众数
- 384.Shuffle an Array(Java)