Mysql数据库优化

image.png

数据库优化顺序:Sql及索引->数据库表结构->系统配置->硬件

第一章:Sql语句优化

什么Sql需要进行优化?
使用Mysql慢查日志对有效率问题的SQL进行监控。
1.查看mysql是否开启慢查询日志:show variables like 'slow_query_log';
2.查看超过多长时间的记录到慢查询日志:show variables like 'long_query_time';

如何判断有问题Sql?

1.查询次数多且查询占比大
2.IO大的sql. rows examine 大的
3.未命中的索引sql。rows examine 和rows Send 对比。examin远远大于rows send

如何分析SQL查询?

1.explain返回各列的含义
2.table:显示这一行的数据是关于哪张表的
3.type:这是重要的列,显示连接使用了何种类型。从最好的到最差的连接类型为                
4.const/eq_reg/ref/range/index和ALL
5.possiable_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。
6.key:实际使用的索引。如果为Null,则没有使用索引。
7.key_len:使用的索引的长度,在不损失精确性的情况下,长度越短越好。
8.ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。
9.rows:MySql认为必须检查的用来返回请求数据的行数。

具体优化:

1.max():在要max的字段上加索引(执行计划不select直接出结果) 
2.count():count(*)会包含null的列,count(字段)不会包含null的列
错误的方式:
select count(date(return_time)='2018-07-02' or date(return_time)='2018-07-03') as     count from heatedloan_credit.pay_order;
正确的方式:(利用NULL值不会被计数的特性)
select count(date(return_time)='2018-07-02' or null) as count1,count(     date(return_time)='2018-07-08' or null) as count2 from heatedloan_credit.pay_order;

3.子查询:

对子查询尽量用join  on 来写,如果有一对多的情况下  要用distinct来去重

4.group by:

如果涉及到表联接的过程中有group by这样的语句,可以先通过group by做为子查询,统        计出结果后,再与其它表进行关联查询。
优化group by 查询后,要在外面加上筛选条件则在子查询中增加
image.png
image.png

5.limit

imit常用于分页处理,时常会伴随order by从句使用,因此大多时候会使用Filesorts这样    会造成大量的io问题
(1).使用有索引的列或主键进行order by操作
(2).记录上次返回的主键,在下次查询时使用主键过滤
即将:select film_id,description from sakila.film order by film_id limit 50,5;
改为:select film_id,description from sakila.film where file_id >55 and film_id<=60     order by film_id limit 1,5;
使用这种方式有一个限制,就是主键一定要顺序排序和连续的,如果主键出现空缺可能    会导致最终页面上显示的列表不足5条,解决办法是附加一列,保证这一列是自增的并增    加索引就可以了

第二章:索引优化
6.索引优化之添加索引

如何选择合适的索引列?
(1).在where,group by,order by,on从句中出现的列
(2).索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 )
(3).离散度大得列放在联合索引前面
select count(distinct customer_id), count(distinct staff_id) from payment;
查看离散度 通过统计不同的列值来实现 count越大 离散程度越高。建立联合索引的时    候,将离散度更高的索引放在前面index(A,B);A离散度大于B

7.索引优化之重复索引,冗余索引,删除不用索引
索引存在的目的是为了加快查询的效率,不过索引不是越多越好,索引多了不但影响写    入效率,会增加数据库判断使用什么索引来查询的开销,还会增加数据库分析的时间。
有时候也会出现以去掉重复或者无效的索引为优化手段的优化方式。
需要删除的索引:重复索引,冗余索引,不用索引
image.png
image.png

显示数据库中重复,冗余索引的SQL:

use information_schema;
SELECT a.TABLE_SCHEMA AS '数据名'
,a.TABLE_NAME AS '表名'
,a.INDEX_NAME AS '索引1'
,b.INDEX_NAME AS '索引2'
,a.COLUMN_NAME AS '重复列名'
FROM STATISTICS a 
JOIN STATISTICS b ON a.TABLE_SCHEMA = b.TABLE_SCHEMA
                    AND a.TABLE_NAME = b.TABLE_NAME
                    AND a.SEQ_IN_INDEX = b.SEQ_IN_INDEX
                    AND a.COLUMN_NAME = b.COLUMN_NAME
WHERE a.SEQ_IN_INDEX = 1 AND a.INDEX_NAME <> b.INDEX_NAME;

可以根据查询结果来删除相关索引

image.png

工具:

image.png

第三章:数据库结构优化

8.1数据库的优化之选择合适的数据类型
(1).使用可存下数据的最小的数据类型
(2).使用简单地数据类型,Int < varchar
(3).尽可能使用not null定义字段
(4).尽量少用text,非用不可最好分表
(5).使用int存储日期时间,:
时间转时间戳:插入数据是时间格式转化为int:unix_timestamp("2016-08-01     13:14:00");
时间戳转时间:查询的时候将int转化为时间格式:fromm_unixtime(1508076155)
(6).ip地址存储可用 bigint (只需要使用7个字节)
ip地址转bigint存储:inet_aton("192.168.168.168")
bigint转ip地址查询:inet_ntoa(3232278696)

8.2数据库的优化之第三范式
遵循表的范式化即数据库设计的规范化,数据表不存在非关键字段对任意关键字段的传    递函数依赖,则符合第三范式。
可以将一张数据表进行拆分,来满足第三范式的要求。
设计表的时候符合范式化是为了:减少数据冗余、减少表的插入、更新、删除异常
设计表的时候使用反范式化是为了:以空间换时间、增强代码的可编程性和可维护性
不符合第三范式要求的表存在以下问题:
(1).数据冗余:(分类、分类描述)对于每一个商品都会进行记录
(2).数据插入异常
(3).数据更新异常
(4).数据删除异常
image.png
8.3.数据库的优化之反范式化:为了查询效率,适当增加冗余,少关联表,以空间换时间
image.png
8.4数据库的优化之表的垂直拆分:解决表的宽度问题
 (1).不经常用得放在同一个表中
 (2).经常用得放在同一个表中
 (3).大的字段单独放在一个表中
比如:商品表(商品编码,商品名称,商品描述,商品图文详情,商品价格,商品数    量,商品库存)等等
因为,商品图文详情是非常大的数据,一般用text类型。使用频率相较于商品价格和库存 小,那么可以拆分到另一张表中,叫商品详情表(商品编码,商品图文详情)等等字段

8.4数据库的优化之表的水平拆分:解决表的量的问题
常用的拆分方法为:
(1).以订单表为例,对user_id进行hash运算,如果需要拆分成5个表,则使用    mod(user_id,5)取出0-4个值。
(2).针对不同的hashId把数据存到不同的表中
(3).按照数据的创建时间按照年月日来拆分
挑战:
(1).跨分区表进行数据查询
(2).统计及后台报表操作(前后台业务分离,前台查询分表的数据,后台要执行报表操作    则把数据统一到汇总表再操作)

其他关于系统配置优化,第三方工具使用,服务器硬件优化,此篇就不做了解啦~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容