高性能Mysql笔记 — 索引】的更多相关文章

index优化 对于频繁作为查询条件的字段使用索引 注意索引字段类型的隐式转换,数据库类型和应用类型要一致 索引的种类 唯一索引,成为索引的列不能重复 单列索引,一个索引只包含一列 单列前缀索引,有些列较长,不宜使用全长作为索引,可以截取列前面一部分作为索引 复合索引(某几列也可以是前缀索引),一个索引包含几个列,复合索引满足最左匹配原则 几个名称 聚簇索引 innodb默认会创建聚簇索引(使用主键聚集数据:如果没有主键,innodb选择一个唯一的非空索引替代:如果没有索引innodb隐式定义一…
索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段.   5.1 索引基础   索引的类型   索引是在存储引擎层而不是服务器层实现的.所以,并没有统一的索引标准:   B-Tree 索引   不同的存储引擎以不同的方式使用B-Tree索引,性能也各有不同:例如,MyISAM使用前缀压缩技术使得索引更小,而InnoDB则按照原数据格式进行存储.再如MyISAM索引通过数据的物理位置引用被索引的行,而InooDB则…
一.背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案. 总的来说索引的出现其实就是为了提高数据查询的效率,就像书的目录一样.一本上千页页的英语字典,如果你想快速找到其中的某一个单词,在不借助目录的情况下,那我估计你可得找一会儿.同样,对于数据库的表而言,索引其实就是它的“目录”.实现索引的方式却有很多种,所以这里也就引入了索引模型的概念.可以用于提高读写效率的数据结构很多,接下里主要介绍常见.也比较简…
一.怎样用索引才高效 1.隔离索引列 MySQL generally can’t use indexes on columns unless the columns are isolated in the query. “Isolating” the column means it should not be part of an expression or be inside a function in the query. 如,以下的查询不能用actor_id索引 SELECT actor_…
一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together in the same structure. 2.为什么一张表只能一个聚集索引? When a table has a clustered index, its rows are actually stored in the index’s leaf pages.The term “clustered…
一. 1. 1). Indexes reduce the amount of data the server has to examine.2). Indexes help the server avoid sorting and temporary tables.3). Indexes turn random I/O into sequential I/O. Lahdenmaki and Leach’s book also introduces a three-star system for…
6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段.这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序.分组等.   在完成这些任务时,查询需要在不同的地方花费时间,包括网络.CPU计算.生成统计信息和执行计划.锁等待等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作.CPU操作和内存不足时导致的IO操作上…
1.1 MySQL逻辑架构 MySql服务器逻辑架构图 1.连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行.服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程. 当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证.认证基于用户名.原始主机信息和密码.一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限. 2.优化与执行 MySql会解析查询…
4.1 选择优化的数据类型   通用原则   更小的通常更好   前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少.   简单就好   简单数据类型的操作需要更少的CPU周期.   尽量避免NULL   值可为NULL的列使得索引.索引统计和值比较都更复杂化.可为NULL的列会使用更多的存储空间.   整数类型   TINYINT SMALLINT MEDIUMINT INT BIGINT.分别使用8,16,24,32,64位存储空间…
MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离.   1.1 MySQL 逻辑架构   基础服务层   第一层构架 :包含连接处理.授权认证.安全等基础服务功能:   核心服务层   第二层构架 :包含查询解析.分析.优化(包括重写查询.决定表的读取顺序.选择合适的索引等).缓存以及内置函数,所有跨存储引擎的功能也在这一层实现:存储过程.触发器.视图等:   存储引…
性能优化 了解查询的整个生命周期,清楚每个阶段的时间消耗情况 性能分析 慢查询日志--服务器性能分析 参考 慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢查询日志 查看慢查询是否打开.以及日志存储位置:show variables like '%slow%' 统计当前数据库连接状态 mysql -e 'show processlist \G' -uroot -proot | grep State | sort | uniq -c | sort -rn…
explain 查看sql的执行计划,只是一个近似结果,一般不会实际执行该sql,如果有子查询就会执行子查询 explain table_name,这儿的table_name含义较广:子查询.union结果 两个变种: explain extended:可以查看将执行计划生成的sql语句,将要被废弃 explain partitions:显示查询将访问的分区 explain的局限: 不会告诉你触发器.存储过程和UDF对如何影响查询结果 不会告诉你mysql执行查询过程中做的特定优化 不会包含执行…
一.mysql索引分类 单值索引:一个索引只包含单个列,一个表可以有多个单列索引 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:一个索引包含多个列 基本语法: 创建:1.CREATE [UNIQUE] indexName ON mytable (columnname(length));——如果是CHAR,VARCHAR类型,length可以小于字段实际长度,如果是BLOB和TEXT类型,必须指定length. 2.ALTER mytable ADD [UNIQUE] INDEX [ind…
1.MySQL架构图 2.事务的隔离性 事务的隔离性是specific rules for which changes are and aren’t visible inside and outside a transaction (1)READ UNCOMMITTED In the READ UNCOMMITTED isolation level, transactions can view the results of uncommitted transactions. At this le…
对于任何给定的数据库通常都有很多表示方法,从完全的范式化到完全的反范式化,以及两者的折中.在范式化的数据库中,每个事实数据会出现并且只出现一次.相反,在反范式化的数据库中,可能会存储在多个地方. 那什么是数据库的范式呢? 第一范式: 每一列都是不可分割的原子数据项.如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式. 第二范式: 在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关. 如果一个关系满足第一范式,并且除了主键之外的其他列,都依赖于该主键,则满足第二范式. 第三范…
锁粒度:表锁.行级锁 表锁锁定整张表 隔离级别: 未提交读:事务中的修改,即使没有提交,对其他事务也是可见的.事务可以读取未提交的数据,也被称为脏读.实际应用中比较少用 提交读:一个事务提交之前,所做的任何修改对其他事务都是不可见的.两次执行同样的查询,可能得到不同的结果.也叫不可重复读. 可重复读:是MySQL默认的事务隔离级别,存在幻读问题. 可串行化:事务串行执行,避免幻读问题 死锁的解释:两个进程在同一个资源上相互占用,并请求锁定对方占用的资源.这个解释很简练.sql也存在死锁问题. I…
什么是聚簇索引 聚簇索引:索引的叶节点就是数据节点(索引值).而非聚簇索引的叶节点仍然是索引节点(告诉你怎么在表中查找这一记录),只不过有一个指针指向对应的数据块. Innodb和MyIsam区别 转载自 (https://www.zhihu.com/question/20596402) InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: InnoDB支持外…
一. 1.什么是hash index A hash index is built on a hash table and is useful only for exact lookups that use every column in the index. For each row, the storage engine computes a hash code of the indexed columns, which is a small value that will probably…
一. 1.什么是B-Tree indexes? The general idea of a B-Tree is that all the values are stored in order, and each leaf page is the same distance from the root. A B-Tree index speeds up data access because the storage engine doesn’t have to scan the whole tab…
1.Good schema design is pretty universal, but of course MySQL has special implementation details to consider. In a nutshell, it’s a good idea to keep things as small and simple as you can. MySQL likes simplicity, and so will the people who have to wo…
1.1  mysql逻辑结构 第一层: 负责连接处理,授权认证,安全等事情 第二层:负责mysql的大部分核心功能 ,查询解析,分析,优化,缓存和所有的内置函数,所有跨存储引擎的功能都在这一层实现,,存储过程,视图,触发器等 第三层:存储引擎,负责mysql中数据的提取和存储: 1.2 并发控制—— 共享锁:也叫读锁,读锁是共享的,多个连接可以同时获取数据并互不干扰! 排他锁:也叫写锁,排他性,阻塞其他的写锁和读锁:在同一时间内,只能有一个用户执行写入操作,并且防止其他用户进行读取正在写入的同一…
什么是索引? 数据库中的一个对象. 在数据库中用来加速表的查询. 通过使用快速路径访问方法定位数据,减少了磁盘的i/o. 与表分别独立存放,但不能独立存在,必须属于某个表. 由数据库自动维护,表被删除时,该表上的索引自动别删除. 索引的作用类似于书的目录,几乎没有一本书没有目录,因此几乎没有一张表没有索引. 怎样创建索引: create index 索引名 on 表名(字段名); 使用索引: where之后加上索引字段即可. 索引原理: 索引页 表 index_name|       loc  …
1.InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的 2.InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的,也就是说如果索引未命中,那么此次操作还是会降级到表锁.如uid为索引 update t_user set age=10 where uid=1;             命中索引,行锁. update t_user set age=10 where uid != 1;           未命中索引…
创建高性能的索引 1. 索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构. 2. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效低使用索引的最左前缀列. 3. B-Tree索引:当人们谈论索引的时候,如果没有特别执行索引类型,那多半说是B-Tree索引,它使用B-Tree数据结构来存储数据.     1). 可以使用B-Tree索引的查询类型:          a. 全职匹配:全值匹配指的是和索引中…
1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概念. 1.1锁的分类 从对数据操作的类型(读\写)分 读锁(共享锁):针对同一块数据,多个读操作可以同时进行而不会互相影响. 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁. 大多数时候,MySQL锁的内部管理都是透明的. 1.2锁粒度(Lock granula…
本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降. 索引优化应该是对查询性能优化最有效的手段了.索引能够轻易将查询性能提高几个数量级,最优的索引有时比一个好的索引性能要好两个数量级. 索引基础 在mysql中…
前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只需要存 0~200,tinyint unsigned 更好.更小的数据类型通常更快,因为它们占用更少的磁盘.内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少. 简单就好.简单数据类型的操作通常需要更少的 CPU 周期.例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较 比 整型…
<高性能MySQL>读书笔记 一. 索引的优点 1. 索引可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数量: 2. 最常见的B-Tree索引按照顺序存储数据,可以用来做order by和group by操作帮助服务器避免排序和临时表: 3. 可以将随机I/O变为顺序I/O: 二. 高性能的索引策略 1. 独立的列 索引不能是表达式的一部分,也不能是函数的参数,如,下面这个查询无法使用索引: SELECT actor_id FROM actor WHERE actor_id+1…
第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比是索引) 索引类型 B-Tree 索引 : 可用于全值匹配.最左前缀匹配.列前缀匹配.范围值匹配.精确匹配某一列并范围匹配另外一列.只访问索引的查询 ,原文截图: 哈希索引 : 只适用于精确匹配查询,不适用于范围查询 空间数据索引 : 可以有效地使用任意维度来组合查询 全文索引 : 做的事情类似于搜索引擎,而…
第4章 Schema 与数据类型优化 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 选择优化的数据类型 选择合适数据类型的三个原则 更小的通常更好 - 速度更快,占用更少 简单就好 - 简单数据类型占用更少的CPU周期,例如整型的比字符串操作代价更低 尽量避免NULL - 查询包含NULL的列,对Mysql来说更难优化,因为会使得索引,索引统计和值比较更为复杂 整数类型 整数的类型有:TINYINT .SMALLINT.MEDIUMINT.INT.BIGINT,分别…