mysql索引

MySQL优化(二)

╄→гoц情女王★ 提交于 2020-03-30 04:43:53
1、建立基础索引:在where,order,join字段上建立索引 优化,组合索引:基于业务逻辑 前缀索引使用上与普通索引一致! 2、索引的存储结构:Btree索引,hash索引,聚簇索引 Btree不是二叉树 在MySQL中,仅仅只有InnoDB的主键索引是聚簇结构,其他的都是典型的BTree结构 Hash索引就是key-value,就是PHP中的关联数组,索引被载入到内存时 3、queryCache,当数据表结构改动,缓存失效,动态数据不能被缓存 show variables like 'query_cache_type' show variables like 'query_cache_size' set global query_cache_size=102760448; select sql_cache * from student where user like '%fyw' 4、分区,partition 一个表的数据和索引存储在不同文件中 //利用id字段,使用hash算法,将数据分布到10个分区内 partition by hash(id) partitions 10 5、算法 (1)hash算法:(均匀分配) 分区算法,在业务逻辑层面,表示均匀分配。 (2)key算法:(均匀分配) partition by key(subject) partitions 10

Elasticsearch浅析

两盒软妹~` 提交于 2020-03-28 01:18:17
目录 Elasticsearch简介 基本概念 Elasticsearch特点 Elasticsearch节点类型 Elasticsearch集群状态 Elasticsearch集群选举 Elasticsearch写操作 Elasticsearch更新和删除操作 Elasticsearch读操作 Elasticsearch故障转移 Elasticsearch优化点 问题 Elasticsearch主要特性 参考文档 Elasticsearch简介 Elasticsearch是一个近实时的分布式搜索分析引擎,常被用作全文搜索,结构化搜索,分析等。它使用 Java 编写的且开源,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。 Lucene 是一个基于Java的全文信息检索工具库,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是Apache Jakarta家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具库。 然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容: 一个分布式的实时文档存储,每个字段可以被索引与搜索 一个分布式近实时分析搜索引擎

MySQL索引查询原理

烂漫一生 提交于 2020-03-28 00:02:14
什么是索引? “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 数据库也是一样,如果查询语句使用到了索引,会先去索引里面查询,取得数据所在行的物理地址,进而访问数据。 索引的优缺点 优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表。 索引的分类 在MySQL中,常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。创建语法分别为: 其中,组合索引又称为多列索引,上述代码中最后一个例子就是建立了3列的索引。MySQL在根据索引查询时,会遵循“最左匹配”原则,即先根据col1的条件查,再根据col2的条件查,然后再根据col3的条件去查。 如果跳过了一个列直接查后面的列,比如下面的语句,就不能使用上面创建的索引了: 这里有一个小技巧,如果你前面的列是一个简单的枚举类型,比如性别等,可以用在where语句中加 col1 in(MALE, FEMALE) 来“跳过” col1 列,并使用上述索引。 对于某列如果是字符串且比较长(比如UUID

MySQL引擎的和区别

狂风中的少年 提交于 2020-03-27 11:52:03
转载自 https://m.nowcoder.com/tutorial/93/8ac75a692a3b4b0a868796b9f008bc2c MySQL引擎 MySQL中的数据用各种不同的技术存储在文件(或内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧和锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或功能,从而改善你的应用的总体功能。 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 MySQL存储引擎主要有:MyISAM、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archieve、Federated、Mrg_Myiasm. 但是最常用的是InnoDB和MyISAM。 InnoDB InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。 InnoDB引擎提供了对数据库ACID事务的支持,并且实现了SQL的四种隔离级别。 该引擎还提供了行级锁定和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。 但是该引擎不支持FULLTEXT类型的索引 而且它没有保存表的行数

MySQL 常见面试题

家住魔仙堡 提交于 2020-03-27 10:54:50
MySQL常见的两种存储引擎:MyISAM与InnoDB Mysql索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 Mysql的BTree索引使用的是B数中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的。   MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。   InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候

MYSQL索引失效的各种情况小结

和自甴很熟 提交于 2020-03-26 09:37:22
一、对列使用函数,该列的索引将不起作用 。 如:substring(字段名,1,2)='xxx'; 二、对列进行运算(+,-,*,/,! 等),该列的索引将不起作用。 如:select * from test where id-1=9;//错误的写法; select * from test where id=10; //正确的写法 ; 三、某些情况下的LIKE操作,该列的索引将不起作用。 如:字段名 LIKE CONCAT('%', '2014 - 08 - 13', '%') ; 四、某些情况使用反向操作,该列的索引将不起作用。 如:字段名 < > 2; 五、在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用 。 六、隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误 。 由于表的字段t_number定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效。 如: select * from test where t_number=13333333333; //错误的写法; select * from test where t_number='13333333333'; //正确的写法; 七、使用not in ,not exist等语句时 。 八、当变量采用的是times变量

MySQL索引的创建、删除和查看

一个人想着一个人 提交于 2020-03-25 14:59:57
3 月,跳不动了?>>> 1 .索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。 例如,有 3 个未索引的表 t1 、 t2 、 t3 ,分别只包含列 c1 、 c2 、 c3 ,每个表分别含有 1000 行数据组成,指为 1 ~ 1000 的数值,查找对应值相等行的查询如下所示。 SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3 此查询结果应该为 1000 行,每行包含 3 个相等的值。在无索引的情况下处理此查询,必须寻找 3 个表所有的组合,以便得出与 WHERE 子句相配的那些行。而可能的组合数目为 1000 × 1000 × 1000 (十亿),显然查询将会非常慢。 如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。 ( 1 )从表 t1 中选择第一行,查看此行所包含的数据。 ( 2 ) 使用表 t2 上的索引,直接定位 t2 中与 t1 的值匹配的行。类似,利用表 t3 上的索引, 直接定位 t3 中与来自 t1 的值匹配的行。 ( 3 )扫描表 t1 的下一行并重复前面的过程,直到遍历 t1 中所有的行。 在此情形下,仍然对表 t1 执行了一个完全扫描

图解MySQL索引--B-Tree(B+Tree)

谁说我不能喝 提交于 2020-03-23 22:45:28
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问! 索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 索引能干什么? 提高数据查询的效率。 索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序。 一、索引的分类 1️⃣从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。 2️⃣从应用层次来分:普通索引,唯一索引,复合索引 3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。 1️⃣中所描述的是索引存储时保存的形式,2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。 就像手机分类:安卓手机,IOS手机

图解MySQL索引--B-Tree(B+Tree)

拜拜、爱过 提交于 2020-03-23 22:11:31
3 月,跳不动了?>>> 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问! 索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 索引能干什么? 提高数据查询的效率。 索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序。 一、索引的分类 1️⃣从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。 2️⃣从应用层次来分:普通索引,唯一索引,复合索引 3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。 1️⃣中所描述的是索引存储时保存的形式,2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。 就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。 普通索引 :即一个索引只包含单个列,一个表可以有多个单列索引 唯一索引 :索引列的值必须唯一,但允许有空值 复合索引 :即一个索引包含多个列 **聚簇索引

读懂MySQL执行计划

让人想犯罪 __ 提交于 2020-03-23 18:51:14
原文:https://mp.weixin.qq.com/s/-BlLvBKcF-yalELY7XkqaQ 前言 在之前的面试过程中,问到执行计划,有很多童鞋不知道是什么?甚至将执行计划与执行时间认为是同一个概念。今天我们就一起来了解一下执行计划到底是什么?有什么用途? 执行计划是什么? 执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看。如下所示: 1.查询t_base_user select * from t_base_user where name="andyqian"; 2.查看上述语句的执行计划 explain select * from t_base_user where name="andyqian"; 执行查看上述2语句后,我们可以得出以下执行计划 上面这个执行计划给到的信息是: 这是一个简单的SQL,全表扫描,共扫描1行,Using where条件在t_base_user表中筛选出记录。发现该语句并没有走索引,为什么是这样的呢?别急,我们紧接着看下一节。上面执行计划是什么意思呢?有什么参考价值呢? 读懂执行计划 通过上面,我们知道了什么是执行计划,也看到了执行计划到底是什么东西,现在我们来具体了解一下,MySQL执行计划中,每个属性代表的是什么意思? 我们一一来介绍