高性能MySQL-第五章创建高性能的索引(2)

高性能的索引策略

一、独立的列

如果查询中的列不是独立的,则MySQL就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的函数。

二、前缀索引和索引选择性

索引部分字符会降低索引的选择性,索引的选择性是指,不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

一般情况下某个列前缀的选择性也是足够高的,足以满足查询性能。对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度。

三、多列索引

union的方式可能更好。

四、选择合适的索引列顺序

五、聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。

当表有聚簇索引时,它的数据行实际上存放在索引的叶子页(leaf page)中。术语“聚簇”表示数据行和相邻的键值紧凑的存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。

InnoDB和MyISAM的数据分布对比

在InnoDB表中按主键顺序插入行

六、覆盖索引

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。

不是所有类型的索引都可以成为覆盖索引,覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引。

七、使用索引扫描来做排序

MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果EXPLAIN出来的type列的值为“index”,则说明MySQL使用了索引扫描来做排序。

只有当索引的列顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或正序)都一样时,MySQL才能够使用索引来对结果做排序。如果查询需要关联多张表,则只有当ORDER BY子句引用的字段全部为第一个表时,才能使用索引做排序。

八、压缩(前缀压缩)索引

MyISAM使用前缀压缩来减少索引的大小,从而让更多的索引可以放入内存中,这在某些情况下能极大的提高性能。默认只压缩字符串,但通过参数设置也可以对整数做压缩。

九、冗余和重复索引

十、未使用的索引

十一、索引和锁

原文地址:https://www.cnblogs.com/zhishuiyushi/p/12391918.html

时间: 2024-10-11 03:28:33

高性能MySQL-第五章创建高性能的索引(2)的相关文章

高性能MySql阅读笔记第五章--创建高性能的索引1

创建高性能的索引1 索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能. 索引对于良好的性能非常重要. 索引优化应该是对查询性能优化最有效的手段了,索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能好两个数量级,创建一个真正“最优”的索引经常需要重写查询. 一.索引的类型 1.B树索引 当人们谈论索引的时候,如果没有特别指明类型,那么多半说的是B树索引,他使用B树数据结构存储数据. 可以使用B树索引的查询类型:全值匹配.匹配最左前缀.匹配列前缀.匹配范围

第五章:创建高性能索引(上)

索引是存储引擎用于快速找到记录的一种数据结构,这也是索引的基本功能.在MySQL中也叫"键key".良好的性能少不了索引.换句话说,索引优化能够将查询性能轻松提高几个数量级. 1. 索引基础 select first_name from actor where actor_id = 5; 运行上面的查询:如果在actor_id列上有索引,MySQL将使用该索引去查找actor_id为5的列,也就是说:MySQL先在索引上按值查找,然后返回包含该值的数据行. 索引可以包含一个或多个列,列

高性能mysql 第5章 创建高可用的索引

一定程度上说,mysql只有b-tree索引.他没有bitmap索引.还有一个叫hash索引的,只在Memory存储引擎中才有. b-tree索引跟oracle中的大同小异. mysql中关于b-tree的限制: 只有做全值拼配或者根据左前缀匹配.我猜测是因为mysql没有基于cost的优化器,它没有对index full scan的操作.因为无法衡量这种full scan是否划得来.所以只能对前缀进行匹配,没有后缀或者中间匹配这种逻辑. 如果是多列索引,顺序很重要,如果没有从索引的第一列开始查

高性能MySQL-第五章创建高性能的索引(1)

在MySQL中,存储引擎使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值. 一.索引的类型 在MySQL中,索引是在存储引擎层而不是服务器层实现的. MySQL支持的索引类型 B-Tree索引 InnoDB使用的是B+Tree. B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同.B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索.根节

mysql命令行下创建和删除索引简介

mysql命令行下创建和删除索引简介: mysql中创建索引可以使用CREATE TABLE语句,也可以用CREATE INDEX或ALTER TABLE来给表增加索引.索引的删除可以使用ALTER TABLE或DROP INDEX语句来实现. (1)使用ALTER TABLE语句创建索引.语法如下:alter table table_name add index index_name (column_list) ;alter table table_name add unique (colum

高性能mysql 第六章查询性能优化 总结(上)查询的执行过程

6  查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返回客户端结果. 而执行部分作为最重要的一环,需要做的事情比较多,而不合适的query往往让执行过程做了不必要的操作,或者不能使用更优秀的底层数据结构,从而用时更久. 6.2慢查询基础:优化数据访问 访问数据量多大,超过实际所需是慢查询的一个原因.导致这种情况的原因大致有两个 1.应用程序向mysql

高性能mysql 第6章 查询性能优化

在mysql的执行计划中: id id用来表示执行顺序,id相同的为一组,先执行id数字大的组,然后执行数字小的组.在id相同的一组内,顺序由上而下执行. type 表示MySQL在表中找到所需行的方式,又称"访问类型",常见类型如下: 由左至右,由最差到最好. ALL代表全表扫描,index代表索引全扫描,range索引范围扫描,ref是非唯一性索引扫描,常见的是作用在=的比较上,但是非唯一.eq_ref:唯一性索引扫描. possible_keys 指出MySQL能使用哪个索引在表

高性能mysql 第6章 查询性能优化(2)

union的局限性: mysql无法将limit条件从外层下推到内层. 如: 可以优化为: 并行执行: mysql无法利用多核特性来并行执行查询. hash关联: mysql不支持hash关联. 跳跃索引扫描(skip index scan) 不支持.经过测试,在5.6版本支持了. 在同一张表上进行更新的限制: MySQL不允许对同一张表同时进行查询和更新.这其实并不是优化器的限制,下面的SQL无法运行,这个SQL尝试将两个表中相似行的数量记录到字段cnt中: 可以通过生成表的形式绕过上面的限制

高性能Mysql(第一章MySQL架构与历史)

逻辑架构 mysql的逻辑架构分为3层, 连接线程处理. 服务器的核心功能,查询解析.分析.优化.缓存以及所有的内至函数. 存储引擎,负责MySQL中数据的存储和提取,每个存储引擎都有它的优势和劣势,服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异. 并发控制 读写锁通常也称为共享锁和排他锁, 读锁是共享的,多个客户在同一时间可以同时读取同一个资源,而互不干扰. 写锁则是排他的,也就是说一个写锁会阻塞其它的写锁和读锁. 锁粒度 表锁是MySQL中的最基本的策略,它会锁定整