提高IOPS能力的几种方法
换SSD,PCIE-SSD(提高IO效率,普通SAS盘5000以内的iops,而新设备可达到数万或者数十万iops)
少做IO的活(合并多次读写为一次,或者前端加内存CACHE;或者优化业务,消除IO)
加大内存(更多hot data和dirty data放在内存中,减少物理IO)
调整文件系统为xfs(相比ext3、ext4提高IOPS能力,高io负载下表现更佳)
调整raid级别为raid 1+0(相比raid1、raid5等提高IOPS能力)
调整写cache策略为wb或force wb(利用阵列卡cache,提高iops)
io scheduler(优先使用deadline,如果是SSD,则使用noop)

SSD设备相关优化手段
• 通过调整 /sys/block/sdx/queue/read_ahead_kb 观察到预读大小为16KB(具体多少要看平均每次IO读大小),通过适当预读提高整体性能。
• 大量的IO请求数必定会产生庞大数量的中断请求,因此需要在多核上绑定中断,避免单核负载过高。

vm.swappiness 设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去,在内存不够用时,释放掉,尽量不使用swap
RHEL 7以下设置为0,RHEL 7以上谨慎设置为5 ~ 10,减少使用swap的概率
[root@localhost ~]# cat /etc/sysctl.conf |grep vm.swappiness
[root@mysql1 ~]# vim /etc/sysctl.conf
[root@mysql1 ~]# sysctl -p
mysql 不使用HugePages
### TokuDB need this kernel settings, start
echo never &get; /sys/kernel/mm/redhat_transparent_hugepage/defrag
echo never &get; /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never &get; /sys/kernel/mm/transparent_hugepage/enabled
echo never &get; /sys/kernel/mm/transparent_hugepage/defrag
### TokuDB need this kernel settings, end

deadline: deadline 算法保证对既定的IO请求以最小的延迟时间。
anticipatory: 有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么。这对于随机读取会造成较大的延时。对数据库应用很糟糕,而对于Web Server等则会表现不错。
cfq: 对每个进程维护一个IO队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每一个IO请求都是公平。适合离散读的应用。
noop: 对所有IO请求都用FIFO队列形式处理。默认IO不会存在性能问题。

首选xfs,其次ext4
mount参数:noatime, nodiratime, nobarrier
对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=0;对于xfs可以指定nobarrier选项

query_cache_type = 0
query_cache_size = 0
tmp_table_size / max_heap_table_size 不建议超过128MB,高并发,简单SQL的场景中,不建议超过64MB
sort_buffer_size / read_buffer_size 等不建议超过8MB
纯InnoDB环境下,key_buffer_size 不建议超过32MB

日志相关
long_query_time = 0.01(10毫秒)
pt-query-digest + Box Anemometer,构建slow query log分析系统
genral_log = 0
log_warnings = 2
binlog = 0/1
sync_binlog = 0/1/N 需要权衡
log_slave_updates = 0/1,在一个集群中,只有一个SLAVE节点开启,其他SLAVE都不开启

MySQL Schema设计原则、优化建议;
• 默认InnoDB,杜绝MyISAM
• 不对InnnoDB表进行在线实时统计
• InnoDB表显式指定自增INT型为主键
• 表字段设计:简单至上
• INT/TIMESTAMP记录时间,而非DATETIME
• IPV4地址用INT,而不是CHAR(15)
• 性别采用ENUM(1,2,3)或者是 tinyint,而不是INT,甚至CHAR
• 杜绝TEXT、BLOG,确实需要则拆分
• 存储较长字符串内容时,提前进行(物理、逻辑)压缩、序列化(JSON/BSON格式)
• 相同用途未来可能会作为JOIN依据的字段,在各个表里的定义属性完全一致
• 显式约束:NOT NULL,DEFAULT ''

CREATE TABLE `sy_hot_words` (
`id` int(11) NOT NULL,
`hot_words` varchar(510) default NULL COMMENT '热词以逗号隔开',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
可以调整为纵向存储,或使用其他模糊搜索技术实现,
或者拆分开,采用 1对N 的结构实现,或者在nosql里,用K-V方式存储

Schema设计、优化,我们可做的:
-- 理解各业务产生的数据流,以及读写数据的方式;
-- 整理数据流中的每个数据项属性信息(类型、范围、过滤性);
-- 分析业务指标,推测数据规模(需要考虑相对长远,例如半年以上,也可以生成一定量级的测试数据,例如至少100万行);
-- 选择相对最适用的硬件设备和数据库架构;
-- 权衡各个SQL的性能和IO量,也即类似于哪个操作权重高一些,那些操作权重适当低一些;
-- 创建适当的索引;
-- 收集测试和生产环境的反馈信息,持续优化索引及表设计;

索引使用中的局限性;
- 通过索引扫描的记录数超过30%,变成全表扫描
- 联合索引中,第一个索引列使用范围查询
- 联合索引中,第一个查询条件不是最左索引列
- 模糊查询条件列最左以通配符 % 开始
- 内存表(HEAP 表)使用HASH索引时,使用范围检索或者ORDER BY
- 两个独立索引,其中一个用于检索,一个用于排序

• 主键/唯一索性能引优于普通索引
• 复合索引比普通索引更合适
• 过度索引可能会带来灾难,够用就行
• 基数(cardinality)很小的列上不建索引
• 长字段使用部分索引,而非全部
• 冗余反向字段便于反向检索
• 采用第三方全文索引工具或者关键字(TAG)对TEXT/BLOB/CHAR字段检索
• 常用检索、排序字段,需要创建索引
• 常用检索、分组(GROUP BY)、排序(ORDER BY)字段,需要创建索引

mysql 优化 (1)的更多相关文章

  1. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  2. 0104探究MySQL优化器对索引和JOIN顺序的选择

    转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...

  3. mysql 优化

    1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...

  4. mysql优化笔记之分页

    过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...

  5. MySQL优化概述

    一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...

  6. MySQL优化实例

    这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...

  7. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  8. mysql优化记录

    老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...

  9. mysql 优化实例之索引创建

    mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...

  10. MySQL优化的奇技淫巧之STRAIGHT_JOIN

    原文地址:http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* ...

随机推荐

  1. Python3 数字Number(六)

    Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建: var1 = 1 var ...

  2. redis的list类型以及其操作

    lists类型 给你个图;' lists类型以及操作List是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是每一个子 ...

  3. MySQL学习(二): 数据类型记录

    整形: 浮点型: 日期时间:(使用较少,可能存在跨区域问题) 字符型: CHAR(M):定长,会将位数补充到M位 VARCHAR(M):非定长,最多到达M位 ENUM('v1','v2',...):从 ...

  4. New Concept English three (23)

    31w 45 People become quite illogical when they try to decide what can be eaten and what cannot be ea ...

  5. input 取消自动填充

    增加属性:  name="clear" 

  6. 策略模式-Java实现

    策略模式—Java实现 1. 现实需求 本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划.是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了 ...

  7. (转)MapReduce Design Patterns(chapter 6 (part 1))(十一)

    Chapter 6. Metapatterns 这种模式不是解决某个问题的,而是处理模式的关系的.可以理解为“模式的模式”.首先讨论的是job链,把几个模式联合起来解决复杂的,有多个阶段要处理的问题. ...

  8. python发送邮件的实例代码(支持html、图片、附件)

    转自http://www.jb51.net/article/34498.htm 第一段代码 #!/usr/bin/python# -*- coding: utf-8 -*- import emaili ...

  9. appium python实例脚本1

    #coding=utf-8import os, time, unittestfrom appium import webdriver PATH = lambda p:os.path.abspath(o ...

  10. 《DSP using MATLAB》示例Example 6.10

    上代码: % Pole-Zero IIR filter to Lattice-ladder structure filter b = [1, 2, 2, 1]; a = [1, 13/24, 5/8, ...