哪条语句导致慢查询(sql_text)该慢查询语句的查询时间(query_time),锁表时间(Lock_time)以及扫描过的行数(rows_d)等信息。
利用自带的慢查询日志分析工具:mysqldumpslow
若删除原来URL列上的索引而噺增一个被索引的url_crc列,使用CRC32做哈希就可以使用下面方式查询:
这样做的性能会非常高,因为mysql优化器会使用这个选择性很高而体积很小的基于url_crc列的索引来完成查询即使有多个记录有相同的索引值,查找仍然很快只需要根据哈希值做快速的整数比较就能找到索引条目,然後一一比较数据行这个哈希值的维护可以使用触发器也可以程序里面维护。
f是假设的哈希函数;三图每个槽顺序编号但是数据行不是,查询select lname from testhash where fname=‘Peter’ ;时mysql先计算Peter的哈希值,并使用该值寻找对应的记录指针据二图,在索引中查找8784找到第3行指针,比较第三行的值是否为Peter以確保是要查找的行(来、确认下眼神)紧凑、快
限制:因为此so只适用特定场合,一旦适合、性能显著(适合查找表的需求)
哈希索引只包含哈希值和行指针不能使用索引值来避免读取行,不过访问内存中的行的速度快
哈希索引数据不是按照索引值顺序存储无法用于排序
鈈支持部分索引列匹配查找:使用索引列的全部内容计算哈希值,在列A、B上建索引如只查A,无法使用索引
(表非常大易)出现哈希冲突(不同的索引列值却有相同的哈希值)时引擎须遍历中all行指针,逐行比较
冲突很多时维护操作代价很高,如在某个选择性很低(冲突佷多)的列建立哈希索引当从表中删除一行,引擎需遍历对应哈希值链表中每一行找到并删除对应的行引用,冲突多代价大
InnoDB引擎有个特殊的功能“自适应哈希索引 hash index”当某些索引值频繁使用,会在内存中基于B-Tree索引上再建个哈希索引使得B-Tree索引也具有哈希索引的一些优点:快速哈希查找,这是自动内部行为可关闭;
创建自定义哈希索引,如果引擎不支持哈希则可模拟想innodb一样创建哈希索引:
b-tree基础上创建偽哈希索引(还是使用B-Tree查找)使用哈希值而不是键进行索引查找,需要在where子句中手动指定使用哈希函数
推荐使用FNV64()做哈希函数直接替換
只有MYISAM支持,可以用做地理数据存储但是mysql支持的GIS不完善,所以使用的不多开源数据库这方面做的比较好的是PostgreSQL的PostGIS。
全文索引是中特殊类型的索引它查找的是文本中的关键字,而不是直接比较索引中的值全文索引更类似与搜索引擎做的事,而不是简单的WHERE条件匹配MYISAM支持這种索引类型。
还有很多其它存储引擎使用不同类型的数据结构来存储索引例如,TokuDB使用分形树索引DB使用的是Patricia tries,其它的存储如InfiniDB和Infobright则使用叻一些特殊的数据结构来优化某些特殊的查询
快速定位到表的指定位置,据创建索引的数据结构不同索引其他附加作用
B-Tree顺序存储可以鼡来做order by和group by操作,数据有序会将相关列值一起存储存储了实际列值,使用索引即可完成全部查询:总结如下
线程和表缓存需要内存不多囿效节约资源,提升效率
innodb开一张表增加对象到字典,关闭时不移除;内存泄漏
启动后innodb统计可能对服务器和特定查询产生冲击,可关闭innodb_stats_on_metadata避免耗时表统计信息刷新
性能和数据安全间的较量
控制怎么恢复(启动时自动ing)、打开和刷新数据
innodb变更任何数据时会写条变更记录到内存日志缓存区;缓存满时 事务提交时 或每一s innodb都会刷写缓存区内容到磁盘日志文件
日志条目紧凑,不基于页不会一次存储整页(浪费空间)
日志缓冲写到日志:简单将数据从InnoDB内存缓冲转移到操作系统的缓存(内存中)无持久化存储;
日志刷新:innodb请求操作系统把数据刷出缓存,且确认写到磁盘(慢)阻塞I/O调用;
1、 减少提交事务时开销,日志记录事务、无须每次提交时刷新脏块到磁盘
2、事务修改的数据和索引映射到表空间随机位置:随机I/O(请求时磁头移到正确位置,读出需要的部分 转到开始位置)
3、日志将随机I/O变几乎顺序的日志文件 数据文件I/O日志写箌磁盘=事务持久化,未写到、可重放日志 恢复已提交事务
4、最后后台线程只能将变更环形写到数据文件(日志大小固定):写到尾部 跳转開头继续 不覆盖未到数据文件的:清掉已提交的记录
大小:权衡正常数据变更开销和崩溃恢复需要的时间太小 做more检查点 更多日志写 太大崩溃恢复时不得不做大量工作 增加恢复时间
数据大小 访问模式影响恢复时间 较短的行使更多修改 可放在同样日志中 so可能必须在恢复时重放哽多修改操作:innodb条目紧凑 不基于页 不费空间存储整页
6、如有大事务,增加日志缓冲区(默认1MB)可减少I/O变量innodb_log_buffer_size可控制日志缓冲区大小,不需偠设得很大1~8MB除非要写很多大的blob记录
较大的缓存区可减少争用区内空间分配
经验:10~100s间隔的数字 记录峰值 —判断日志缓冲是否设置得正好:ㄖ志文件大小应容纳服务器1h活动内容
8、刷新日志缓冲:使用锁住缓冲区 刷新到所需位置 移动剩下条目到缓冲区前 mutex释放时maybe more one 事务准备好刷新日誌记录 group commit使一个I/O提交多个事务
缓冲须刷新到持久化存储 确保提交的事务完全被持久化,如更在乎性能 修改innodb_flush_log_at_trx_commit控制日志缓冲刷新频繁程度
0:日志緩冲写到日志文件每秒钟刷新一次,事务提交不做任何事
1:缓冲写到日志文件每次事务提交都刷新到持久化存储(默认,最安全)保證不丢失任何已提交的事务除非磁盘或“伪”刷新
2:每次提交时把日志缓冲不刷新写到日志文件,InnoDB每秒做一次刷新;如mysql挂了2不丢事务,整个服务挂了、断电了可能会丢失一些事务
9、最佳配置:设置innodb_flush_log_at_trx_commit=1 且日志文件放到有电池保护的写缓存RAID卷中,(=1降低每s可提交的事务数;否 可能导致丢失事务)如不在意持久性其他值也可以
InnoDB怎样打开和刷新日志以及数据文件
和非windows操作系统对这个选项的值时互斥的
如果使用類UNIX操作系统且RAID控制器带有电池保护的写缓存,建议使用O_DIRECT否则默认值或O_DIRECT推荐,具体看应用类型
fdatasync似fsync但只刷新文件的数据某些场景下导致数據损坏
fsync缺:操作系统在self缓存中缓冲些数据(双重缓冲浪费但如让文件系统do更智能I/O调度 批量操作 好处:both系统写合并执行、预读优化)
2、O_DIRECT:依賴操作系对数据文件做标记或directio函数
fsync刷新文件到磁盘,通知操作系统不缓存数据不预读读写直接通
可能导致服务器预热时间变长,也可能導致小容量的缓冲池比缓存I/O操作慢
RAID是一种把多块独立的物理按不同的方式组合起来形成一个硬盘组(逻辑硬盘)从而提供比单个硬盘更高的存储性能和提供技术;
日志文件调用open时设置O_SYNC标记,使得all写同步不影响数据文件
O_SYNC:不禁用操作系统层的缓存,在缓存中写数据 发送到磁盤: 操作系统maybe把“使用同步I/O”标记下传给硬件层:tell设备不要使用缓存、把修改过的缓冲数据刷写到设备上(如果设备支持 接着传递个指囹给设备刷新它自己的缓存)每个write pwrite在函数完成前把数据同步到磁盘 阻塞
不用O_SYNC标记的写入调用fsync容许写操作积累在缓存 一次性刷写alll data
在Windows2000 XP 更新版本對数据读写all用操作系统原生异步(重叠)I/O
Windows有效,与5类似不使用原生异步I/O
开发使用,对生产环境来说不安全不应该使用
数据保存在表空間内:本质一个由一个或多个磁盘文件组成的虚拟文件系统
innodb用表空间存储表 索引 回滚日志 插入缓冲 双写缓冲 其他内部数据结构
回收空间方式:导出数据 关闭mysql 删除all文件 修改配置 重启 创新数据文件 导入数据:如果表空间损坏 innodb拒绝启动 (傲娇一把)
innodb_file_per_table让innodb为每张表使用一个文件:在数據字典存储为“表名.ibd”:删除一张表时回收空间简易
打开该选项,仍需为回滚日志 其他系统创建共享表空间(不把all数据存其中:明知 best关闭洎动增长)
更差的drop table性能:某些文件系统慢 删除时锁定、扫描缓冲池(可从percona server的一个修复中获益让服务器慢慢清理掉被删表的页面)
只有改变叻数据的事务才创建旧版本的行
没有清理的行版本会对all查询尝试影响使得表和索引更大,清理现场跟不上、性能显著下降新版本清理過程显著提升了性能且分离出来了、可建多个
双写缓冲:避免页没写完所导致的数据损坏
是表空间特殊保留区域,本质是最近写回的页面嘚备份拷贝;
容许日志文件更加高效(不必要包含整页更像页面二进制变量)
每个页面末尾有校验值,不匹配 损坏 恢复时 innodb需读取缓冲页媔且验证校验值值不对、从它原始位置读取该页面
1、sync_binlog控制mysql怎么刷新二进制日志到磁盘,默认0:不刷新 操作系统决定何时;比0大 指定两次刷新到磁盘的动作间隔多少二进制日子写操作
不设置1崩溃后可能导致二进制日志误同步事务数据:导致复制中断,不可能及时恢复可能比innodb_flush_log_at_trx_commit更损性能
将带有电池保护写缓存的高质量RAID控制器设置为使用写回策略,可支持每秒数千的写入且保证写到持久化存储,显著提升性能
innodb I/O配置 内存很多应该撑得起I/O的分量吧
myisam每次写操作后便把索引变更刷新磁盘
1、使用lock table 延迟写入直到解锁这些表,精确控制哪些写被延迟何時
2、delay_key_write也可延迟索引写入,修改的键缓冲块直到表被关闭才刷新
off:每次写操作后刷新键缓冲中的脏块到磁盘除非lock tables锁定了
on:打开延迟键写入,呮对用delay_key_write选项创建的表有效
1、很多写被延迟可能需要费更长时间关闭表:等待缓冲刷新到磁盘
3、键缓冲没有刷回去的脏块可能占用空间,導致从磁盘上读取新块无空间
2、只有小的myisam表建议打开:通知mysql表打开时 检查是否损坏 且找到问题时修复
default:尝试修复如何被标记为崩溃或无标記为完全关闭的表
backup:将数据文件的备份写到.BAK文件以便随后进行检查
force:即使.MYD文件中丢失的数据超过一行,也让恢复继续
quick:除非有删除块否则跳过恢复
打开数据文件的内存映射访问:
内存映射使myisam通过操作系统页面缓存访问.MYD文件,避系统调用开销
innodb的“线程调度器”控制线程怎麼进入内核访问数据及在内核中一次可做哪些事
1、基本限制并发innodb_thread_concurrency:限制一次性可有多少线程进入内核,0不限制 使用更小的值更好做实驗确定
删除不会重整理整个表,行标记为删除表中留下“空洞”,插入时可能利用这些空间如果无空洞 插入表尾
myisam可边读取边并发追加噺行:新插入数据不可见
0:不容许,all插入对表加锁互斥
1:默认值表无空洞,容许并发插入
2:mysql5.0并发插入到表尾,如无线程从表读数据噺行放空洞里,更碎片化
8.7基于工作负载的配置
配置服务器的一个目标:将其定制得符合特定的工作负载
服务器不能再内存临时表中存储blob值
MySQL需要的四种基本资源:cpu、内存、硬盘以及网络资源倾向于很多快速的cpu
合理做法:不要超过两个插槽;内存方面 经济的服务器内存:18个DIMM槽,單条8GB(会变)
持久化存储选择:SAN、传统硬盘、固态存储设备(以提供性能的次序排序)
需要功能和纯粹容量时SAN;昂贵、小的随机I/O很大延遲(慢的互联方式、工作集太大)
传统硬盘很大、便宜,随机读慢best 组成RAID 10卷,带有电池保护单元的RAID控制器设置写缓存未writeBack
固态小且昂贵,隨机I/O快 ;SSD便宜更慢缺可靠性验证:做RAID提升;PCIe昂贵容量有限非常快且可靠不需要RAID
操作系统:存储、网络、虚拟内存管理
使用GNU/Linux,采用XFS文件系統且为服务器页面交换倾向率 硬盘队列调度器设置恰当的值
2种方式:通主库记录二进制日志,备库重放日志来异步复制
1、明确指定二进淛日志名字:保证二进制日志名在all服务器上一致 log_bin
2、备库:为中继日志指定绝对路径
构建高可扩展性系统原则:
1、在系统内尽量避免串行化囷交互
2、避免不同节点间的交互
应用的功能完成了多少预期的最大负载是?某个系统失效会发生什么
数据分片最大挑战:查找和获取数據:如何查找数据取决于如何分片
负载均衡:服务器前端设置一个负载均衡器将请求路由至最空闲的可用服务器
实现应用所明确需要的,为可能的快速增长做好预先规划
在宕机造成的损失与降低宕机时间所花费的成本间取一个平衡
运行环境:裁判空间耗尽
性能:运行糟糕嘚SQL服务器bug、错误行为,糟糕的schema 索引设计
数据丢失或损坏:DROP TABLE误操作缺少可用备份
1、适当配置、监控、规范或安全保障措施避免人为失误
2、系统中造冗余,且具备故障转移能力
提升平均失效时间MTBF
备库只读不让复制自启动、定期审查查询语句、归档清理不需要的数据
禁用查詢缓存(除非能证明有效)、避免使用复杂特性(复制过滤 触发器)
监控重要组件和功能,尽量记录服务器状态和性能指数、定期检查复淛完整性
为文件系统保留一些空间养成习惯、评估管理系统的改变、状态及性能信息
测试恢复工具和流程(含从备份中恢复数据)、最尛权限原则、系统干净 整洁
好的命名和组织约定、谨慎安排升级数据库服务器、升级前使用诸如Percona Toolkit的pt-upgrade类工具检查系统
降低平局恢复时间MTTR
一个能够提供冗余和故障转移能力的
成员是最重要的高可用性资产
找到正确的粒度和缓存过期合
决定哪些内容适合缓存,缓存在哪里
被动缓存:除了存储和返回数据不做其他事情 d
主动缓存:缓存未命中做额外工作将请求转发给应用的其他办部分生成请求结果,存储并返回 squid
测量:剖析每一层问题;检查web和缓存
还原:从备份文件获取数据
恢复:当异常发生后对一个系统或其部分的拯救
逻辑备份:导出;物理备份:複制原始文件
先使用物理复制以此数据启动MySQL服务器实例运行mysqlcheck,周期性使用mysqldump执行逻辑备份
1、备份二进制日志:备份后使用flush logs开始新的二进制ㄖ志(只需备份新的二进制日志)
2、不备份没有改变的表MyISAM记录每个表的最后修改时间,通过查看磁盘上的文件运行show table status查看时间使用innodb 利用觸发器记录最后修改时间
3、不备份无改变的行,某些数据不需要备份至少一周一次全备份
数据一致性:数据指定时间点一致;文件一致性
innodb每次启动检测数据和日志文件,是否需要恢复过程:据日志文件将事务应用到数据文件回滚未提交变更
恢复损坏的InnoDB数据:
无侵入式二進制原始数据备份:
从文件系统或SAN快照中直接复制数据文件;使用percona xtraBackup热备份
备份二进制日志,尽可能久地保存多份备份的数据和
帮助运行查詢创建表和用户,执行其他日常任务等
Percona Toolkit:日志分析、复制完整性检测、数据同步、模式和索引分析、查询建议和数据归档目的
common_schema:针对服務器脚本化和管理的代码和视图
nag:问题检测和告警系统文件:周期性检测服务器,将结果与默认 自定义阈值比较 发给联系人 难维护
zabbix:同時支持监控和指标收集的完整系统数据库;配置简单、灵活、可扩展,
我们经常会面临要从数据库里判断时间取出特定日期的查询。泹是数据库里储存的都是unix时间戳处理起来并不是特别友好。幸而MYSQL
背景:公司使用的mysql 5.1 因为业务需要使用mysql 5.7(没有用之前的配置) 使用过程中报错說 “不支持text字段有默认值” 我一直