mysql性能优化与ORM分库分表



一.语句上外部配置优化:
1.1 系统日志有很多语句
慢查询语句

show_query_log = TRUE
show_query_file = /usr/local/mysql/slow_query_log.txt
show_query_time = 3
执行计划器:
EXPLAIN SELECT*FROM t;
explain select*from t;
使用执行计划器,看时间状态,进行判断sql性能好坏:
查询出数据,有字段type,最佳到最差按照排序有如下值(type):
system 最佳的值
const 主键也是索引
eq_ref 链接查询 查询条件是索引
ref
ref_or_null 链接有空值
all 最差的值
最差是all全表查询
索引根据我们数据结构抽取的另外一个隐性数据类型的数据结构,实现了B-Tree
或B+查询算法。

1.2 mysql 5.1以下版本联合索引失效:
如果用联合索引 只用或用到第一个字段(最左边字段)参与查询,联合索引会生效:


如果用联合索引 没有用到第一个字段参与查询,联合索引会失效:

此截图是mysql5.5 虽然慢,但还是使用到了索引,高版本优化了索引。

1.3 mysql 5.1以下版本联合索引失效:or,and
or的情况下两边都是单个索引字段,索引不生效--可以用联合索引。
但是5.6以上版本是生效的-两边都加索引字段提高效率。
--EXPLAIN select *from m_member_table where name='zhangsan' or age= 24
在or的两边(或or的其中一边)都是索引的情况下,失效--可以用联合索引。


5.6以上版本,两边都加索引字段提高效率。


and的情况下(或and的其中一边)单个索引是生效,记住这个坑,and两边有一个或都是索引字段就是生效。


1.4 mysql 5.1以下版本联合索引失效:like
like,正则查询,sphinx斯芬克斯搜索加速中文分词高能显示
使用like查询的时候,如果%符号在第一个位置,索引可能用不上
select * from t1 where name like "admin%" 索引用的上
select * from t1 where name like "%admin" 用不上

多表查询的时候不要使用子查询。因为子查询创建临时表,不仅创建还要销毁

二.简化sql:
1.不是用子查询
子查询就是将内层查询结果当外层条件,执行子查询时创建了临时表在磁盘中,创建和删除临时表耗费资源。
尽量采用join,或减少select嵌套
2.加陈余字段
尽量不使用join。比如订单行表加商品信息,订单表加总金额。

三.优化服务器硬件:
1.配置大内存
2.高速磁盘,合理分配磁盘,多核处理器。

四.mysql参数优化:
参数要结合数据引擎
不是越大越好,取决于内存大小。
比如:
key_buffer_size:表示索引缓冲区的大小。索引缓冲区所有线程共享。增加索引缓冲区可以得到更好的处理的索引(对所有读和多重写),它的大小取决于内存的大小,如果值太大,导致操作系统频繁换页,也会降低性能。
sort_buffer_size:表示每个需要排序的线程分配的缓冲区大小,增加这个参数值可以提高Order by与 Group by操作速度,默认值是2M。
table_cache:表示同时打开表的个数,这个值越大能够打开表个数越多,过大同时打开表太多会影响操作系统性能。
query_cache_size与query_cache_type

http://blog.csdn.net/jshuanghua/article/details/53858490

执行计划器:--深入学习
还包括内部参数优化,服务器版本,硬件,业务场景。唯一索引,注入索引。
redis 3.0以下不能做集群,可以使用主从,用哨兵监控。
redis 3.0以上做claub集群。

以上参考: http://blog.csdn.net/zhuxineli/article/details/14455029
postgre参考: http://blog.csdn.net/chuan_day/article/details/45841345
explain ANALYZE,set enable_seqscan to false;


object relation mapping
(隐藏了数据访问细节,把sql写在java拼接,反射牺牲性能,多表力不从心)
分库分表
尽可能做到 同一个操作在一个库里。
分表产生id问题
1专门一张表,存储自增ID
2利用一致算法,根据时间不同,或者其他业务数据值,计算唯一的ID

分表
每个表结构一样,表明不同。
把表明计算规则抽取出来,每次查询之前,根据业务值,计算查询结果所在表。
查询之前,必须明确查询的范围比如时间点

分库
1.当使用切换数据源后,aop配置,事后处理,
自动切换到默认的数据源。
2.根据时间2015,2016,起不同key名,传入年份参数进行动态切库。

分库分表规则:
1.范围:数据分成n个区间范围,根据业务数据计算出记录所在范围区间。
2.哈希(hash):根据业务值,计算出hashcode,再对应具体数据库。
3.预定一个列表值,比如按照时间分库

产生问题:
1.两个库,进行分页如何解决。
2.查询两个表,分别在不同库,只能查询两次。这个问题不能避免,所以尽可能统一业务放一个库。
3.跨库服务操作,用到分布式事物。

总结
自己实现分库分表代码

聚簇索引与非聚簇索引
http://blog.csdn.net/lijiaz5033/article/details/50129723
https://www.cnblogs.com/T8881/p/5940338.html

猜你喜欢

转载自572327713.iteye.com/blog/2342360