mysql性能优化与ORM分库分表

[img]http://dl2.iteye.com/upload/attachment/0128/6049/7beb2138-cb45-32a0-b516-cd54027ae323.jpg[/img]

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

[b]1.2 mysql 5.1以下版本联合索引失效:[/b]
如果用联合索引 只用或用到第一个字段(最左边字段)参与查询,联合索引会生效:
[img]http://dl2.iteye.com/upload/attachment/0123/8810/73077161-1564-3d70-83f2-cb53fd94b0ff.png[/img]

如果用联合索引 没有用到第一个字段参与查询,联合索引会失效:
[img]http://dl2.iteye.com/upload/attachment/0123/8812/c6ba6aa3-0f95-322d-b971-8e125e4e5bad.png[/img]
此截图是mysql5.5 虽然慢,但还是使用到了索引,高版本优化了索引。

[b]1.3 mysql 5.1以下版本联合索引失效:or,and[/b]
or的情况下两边都是单个索引字段,索引不生效--可以用联合索引。
但是5.6以上版本是生效的-两边都加索引字段提高效率。
--EXPLAIN select *from m_member_table where name='zhangsan' or age= 24
在or的两边(或or的其中一边)都是索引的情况下,失效--可以用联合索引。
[img]http://dl2.iteye.com/upload/attachment/0123/8816/ac8fd134-179f-34ed-a69b-246a83b1de45.png[/img]

5.6以上版本,两边都加索引字段提高效率。
[img]http://dl2.iteye.com/upload/attachment/0127/8500/1f6472af-65bb-3c46-8ebc-157d3a126c47.png[/img]

and的情况下(或and的其中一边)单个索引是生效,记住这个坑,and两边有一个或都是索引字段就是生效。
[img]http://dl2.iteye.com/upload/attachment/0123/8818/41fbe6af-712d-3db3-beec-901336d80c8a.png[/img]

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

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

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

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

[b]四.mysql参数优化:[/b]
参数要结合数据引擎
不是越大越好,取决于内存大小。
比如:
key_buffer_size:表示索引缓冲区的大小。索引缓冲区所有线程共享。增加索引缓冲区可以得到更好的处理的索引(对所有读和多重写),它的大小取决于内存的大小,如果值太大,导致操作系统频繁换页,也会降低性能。
sort_buffer_size:表示每个需要排序的线程分配的缓冲区大小,增加这个参数值可以提高Order by与 Group by操作速度,默认值是2M。
table_cache:表示同时打开表的个数,这个值越大能够打开表个数越多,过大同时打开表太多会影响操作系统性能。
query_cache_size与query_cache_type
[img]http://dl2.iteye.com/upload/attachment/0127/8489/703a953b-76c0-335a-8e83-153ea9fd5154.jpg[/img]
[url]http://blog.youkuaiyun.com/jshuanghua/article/details/53858490[/url]

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

以上参考:[url]http://blog.youkuaiyun.com/zhuxineli/article/details/14455029[/url]
postgre参考:[url]http://blog.youkuaiyun.com/chuan_day/article/details/45841345[/url]
explain ANALYZE,set enable_seqscan to false;

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

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

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

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

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

[b]总结[/b]
自己实现分库分表代码

聚簇索引与非聚簇索引
[url]http://blog.youkuaiyun.com/lijiaz5033/article/details/50129723[/url]
[url]https://www.cnblogs.com/T8881/p/5940338.html[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值