sql优化

Atlas做mysql读写分离

烂漫一生 提交于 2020-02-26 15:41:20
Atlas做mysql读写分离: Atlas奇虎360的一个开源中间代理,是在mysql-proxy 0.8.2的基础上进行了优化,增加一些新的功能特性。 wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm rpm -i Atlas-2.2.1.el6.x86_64.rpm 安装路径为/usr/local/mysql-proxy /usr/local/mysql-proxy/bin/encrypt xxxxxxx vi /usr/local/mysql-proxy/conf/test.cnf admin-username = ming admin-password = xxxxxx proxy-backend-addresses = 10.0.1.3:3306 proxy-read-only-backend-addresses = 10.0.1.4:3306@1,10.0.1.5:3306@1 pwds = ming:QeoyfAql8w4a8s/oWZlMvQ== proxy-address = 10.0.1.2:1234 admin-address = 10.0.1.2:2345 #client-ips = 127.0.0.1, 192.168.1

从零开始学习MySQL全文索引

风流意气都作罢 提交于 2020-02-26 14:01:39
目录 一、为什么要用全文索引 二、什么是全文索引 三、如何创建全文索引 四、创建测试数据 五、查询-使用自然语言模式 六、查询-使用布尔模式(强大的语法) 语法 示例 七、查询-使用扩展模式 八、注意事项 一、为什么要用全文索引 传奇小说 m.xs86.com 我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因 like查询太慢、json字段查询太慢(车太慢了) 没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法将五菱宏光换成兰博基尼,即使有兰博基尼也不会开) 加索引、联合索引啥的都已经慢得不行了(限速80,车顶盖都卸了也只能开到30) 为了提升一下自己的逼格(人家问你有没有开过法拉利,你说开过肯定更有气质一点) 二、什么是全文索引 简单的说,全文索引就相当于大词典中的目录,通过查询目录可以快速定位到想看的内容。 全文索引通过建立 倒排索引 来快速匹配文档(仅在mysql5.6版本以上支持) 全文索引将连续的 字母、数字和下划线 当做一个单词,分割单词一般用 空格/逗号/句号 MySQL的全文索引支持以下3种查询模式: 自然语言模式( IN NATURAL LANGUAGE MODE ) 通过MATCH AGAINST 传递某个特定的字符串来进行检索 布尔模式( IN BOOLEAN MODE ) 支持操作符,例如

Mysql索引选择逻辑

拟墨画扇 提交于 2020-02-26 12:53:30
有时候我们会发现mysql可能出现选错索引的情况,要了解这个问题我们得先看看sql优化器是怎么选择索引的 索引选择逻辑 优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少 扫描行数是怎么判断的? MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数 这个统计信息就是索引的“区分度”。显然,一个索引上不同的值越多,这个索引的区分度就越好。而一个索引上不同的值的个数,我们称之为“基数”。也就是说,这个基数越大,索引的区分度越好 MySQL 是怎样得到索引的基数的呢 采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数 而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计 在 MySQL 中,有两种存储索引统计的方式,可以通过设置参数 innodb_stats_persistent 的值来选择: 设置为 on 的时候,表示统计信息会持久化存储。这时,默认的 N 是 20,M 是 10。 设置为 off 的时候

mysql 执行流程解析

不问归期 提交于 2020-02-26 07:44:55
MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核 心服务功能,以及所有的内置函数,所有跨存储引 擎的功能都在这一层实现,比如存储过程、触发器、视图等 而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、 MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB 我们来看一下sql的执行流程 连接器 第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端 建立连接、获取权限、维持和管理连接 连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在 show processlist 命令中看到它 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时 建立连接的过程通常是比较复杂的,所以在使用中要尽量减少建立连接的动作,也就是尽量使用长连接 但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因 为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断 开的时候才释放 怎么解决这个问题呢?你可以考虑以下两种方案。 定期断开长连接。使用一段时间

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

◇◆丶佛笑我妖孽 提交于 2020-02-26 06:51:41
本文出处: http://www.cnblogs.com/wy123/p/7374078.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra列的信息太多了,只能做简单分析) ICP原理通俗讲就是,查询过程中,直接在查询引擎层的API获取数据的时候实现"非直接索引"过滤条件的筛选,而不是查询引擎层查询出来之后在Server层筛选。 换句话说就是ICP在获取数据的同时实现了where的次选条件中无法直接使用索引的情况下的筛选,避免了没有ICP优化的时候分两个步骤的实现(获取数据的过程没有做次选条件的过滤) 如果是非ICP优化查询的话,是两步,第一步是获取数据,第二步是获取的数据进行条件筛选。 显然,相比后者,前者可以一步实现索引的查找Seek+filter,效率上更高。 适应的场景: ICP的优化策略可用于range、ref、eq_ref、ref_or_null 类型的访问数据方法 其实没有实例不太好理解这种优化策略,还是举两个实际列子吧。 ICP优化实例 第一个例子在网上非常多,也非常容易理解

MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

北战南征 提交于 2020-02-26 06:49:57
关于如何理解MySQL执行计划中Extra列的Using where、Using Index、Using index condition,Using index,Using where这四者的区别。首先,我们来看看官方文档关于三者的简单介绍(官方文档并没有介绍Using index,Using where这种情况): Using index (JSON property: using_index) The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index. For InnoDB tables that have a user-defined clustered index, that index can be used even when Using index is absent from the Extra column. This is the

MySQL 优化之 ICP (index condition pushdown:索引条件下推)

情到浓时终转凉″ 提交于 2020-02-26 06:49:07
ICP技术是在MySQL5.6中引入的一种索引优化技术。它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数。在索引组织表中,使用二级索引进行回表的代价相比堆表中是要高一些的。相关文档地址:http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html Index Condition Pushdown optimization is used for the range , ref , eq_ref , and ref_or_null access methods when there is a need to access full table rows. This strategy can be used for InnoDB and MyISAM tables. (Note that index condition pushdown is not supported with partitioned tables in MySQL 5.6 ; this issue is resolved in MySQL 5.7.) For InnoDB tables, however, ICP is used only for

mysql优化之索引篇

泪湿孤枕 提交于 2020-02-26 05:28:39
对mysql优化是一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM) i: sql语句优化 本篇主要总结下索引有关内容 索引 四种索引(主键索引/唯一索引/全文索引/普通索引) CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] (列部分值作为索引) 列部分值作为索引:: 对于CHAR和VARCHAR列,只用一列的一部分就可创建索引。 创建索引时,使用col_name(length)语法,对前缀编制索引。 前缀包括每列值的前length个字符。 BLOB和TEXT列也可以编制索引,但是必须给出前缀长度。

构建 MariaDB Galera Cluster 分布式数据库集群(一)

核能气质少年 提交于 2020-02-26 02:34:31
MariaDB Galera Cluster 介绍 简介 MariaDB集群是MariaDB同步多主机集群,仅支持XtraDB(详见本文结尾注释)/InnoDB存储引擎(虽然有对MyISAM实验支持 - 看wsrep_replicate_myisam系统变量) 主要功能 同步复制 --- Galera主从复制是同步的,底层依赖rsync; 真正的multi-master,即所有节点可以同时读写数据库; 自动的节点成员控制,失效节点自动被清除; 新节点加入数据自动复制; 真正的并行复制,行级; 用户可以直接连接集群,使用感受上与MySQL完全一致; 优势 因为是多主,所以不存在Slavelag(延迟) 不存在丢失事务的情况 同时具有读和写的扩展能力 更小的客户端延迟 节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的 说明 Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。 以下内容摘自于 https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/,是在发布 MariaDB 10.1版本时摘录的 MariaDB Galera

从原理到优化,深入浅出数据库索引

爷,独闯天下 提交于 2020-02-26 02:08:32
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序