mysql索引

MySQL全文索引、联合索引、like查询、json查询速度大比拼

若如初见. 提交于 2020-03-03 07:55:30
查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775) 我们需要在这10万条数据中检索特定类型的数据,目标总数据量: 2931 条 SELECT COUNT(*) FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1 我们在限定为上面类型的同时,还得包含下面任意一个编码(也就是OR查询) jy1577683381775 jy1577683380808 jy1577683379178 jy1577683378676 jy1577683377617 jy1577683376672 jy1577683375903 jy1578385720787 jy1499916986208 jy1499917112460 jy1499917093400 jy1499917335579 jy1499917334770 jy1499917333339 jy1499917331557 jy1499917330833 jy1499917329615 jy1499917328496 jy1576922006950 jy1499916993558 jy1499916992308 jy1499917003454

mysql-覆盖索引

天大地大妈咪最大 提交于 2020-03-03 00:59:27
MySQL索引详细介绍 高性能mysql之前缀索引 MYSQL索引:对聚簇索引和非聚簇索引的认识 Mysql中MVCC的使用及原理详解 mysql-覆盖索引 来源: https://www.cnblogs.com/doyi111/p/12399204.html

mysql 添加索引语句

久未见 提交于 2020-03-02 17:52:42
1.PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE (`column` ) 3.INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.FULLTEXT(全文索引) mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column` ) 5.多列索引 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 来源: https://www.cnblogs.com/hgxbo/p/10489874.html

深入理解MySQL底层实现

自古美人都是妖i 提交于 2020-03-02 13:01:12
本文摘自: http://harlon.org/2018/06/20/database/ 深入理解MySQL底层实现 这里选用MySQL作为了解数据库的底层实现,这是因为MySQL是目前最常用的数据库,了解它的底层实现也基本上对目前大数据的数据库所用的技术会有一个大致的了解。数据库最主要的索引设计,了解数据库的索引设计基本上就对数据库有了大致的了解,其次对其事务的ACID操作实现原理做以分析,以及数据库中所用到的提高其性能的优化等等。 存储引擎 MySQL常用的存储引擎有InnoDB和MyISAM,其中MyISAM是MySQL的默认存储引擎。 InnoDB InnoDB的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而idb是数据文件。InnoDB中存在表锁和行锁,不过行锁是命中索引的情况下才会起作用的。 InnoDB支持事务,且支持四种隔离级别,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

神奇的 SQL 之 WHERE 条件的提取与应用

你。 提交于 2020-03-02 12:18:48
问题描述 一条 SQL 在数据库中是如何执行的呢 ?相信很多人都会对这个问题比较感兴趣。但是,感兴趣归感兴趣,你得去追呀,还臆想着她主动到你怀里来 ? 一条 SQL 在数据库中的生命周期涵盖了 SQL 的词法解析、语法解析、权限检查、查询优化、SQL执行等一系列的步骤,是一个相当复杂的过程,不亚于你追她的艰苦历程,不是只言片语就说的完的。但是,大家先别紧张,上面说的那些了,今天一个也不讲,气不气 ? 今天和大家一起来看一下 SQL 生命周期中比较有意思的一个环节 给定一条 SQL,如何提取其中的 where 条件 ? where 条件中的每个子条件,在 SQL 执行的过程中有分别起着什么样的作用 ? SQL 执行流程 这是 MySQL 数据库中 SQL 的执行流程,其他数据库应该类似 关系型数据库中的数据组织 关系型数据库中,数据组织涉及到两个最基本的结构:表与索引。表中存储的是完整数据记录,分为堆表和聚簇索引表;堆表中所有的记录无序存储,聚簇索引表中所有的记录则是按照记录主键进行排序存储。索引中存储的是完整记录的一个子集,用于加速记录的查询速度,索引的组织形式,一般均为B+树结构 MySQL 的 InnoDB 采用的是聚簇索引表,数据记录和索引是一起存储的,类似如下 InnoDB 二级索引(非聚簇索引)的结构与聚集索引的结构基本相同,只是叶子节点有些许差别

B-树

六眼飞鱼酱① 提交于 2020-03-02 11:29:21
B-树(读作B树) mysql数据库的索引基于Hash表或B+树 索引采用树结构存储,查询效率高,还可以操持有序。 数据库不使用二叉树的原因: 从算法逻辑上来讲,二叉树的查找速度和比较次数都是小的。但是,要考虑磁盘IO。 数据库的索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多,当我们利用索引查的时候,不可能把整个索引全部加载到内存,只能逐一加载每一个磁盘页(磁盘页对应索引数的节点) 磁盘IO数是由数的高度确定的,磁盘IO数<=树的高度 为了减少磁盘IO,就要把树变得"矮胖",这就是B-树的特征之一 B树是一种多路平衡查找树,一个m阶B树有如下几个特征: 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 应用:MongoDB 来源: CSDN 作者: 蒟蒻级玩家 链接: https://blog.csdn.net/qq_44144735/article/details/104605384

Mysql锁的优化

不想你离开。 提交于 2020-03-02 10:05:36
获取锁等待情况 可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺: mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | Table_locks_immediate | 105 | | Table_locks_waited | 3 | +----------------------------+----------+ 2 rows in set (0.00 sec) 可以通过检查Innodb_row_lock状态变量来分析系统上的行锁的争夺情况: mysql> show status like 'innodb_row_lock%'; +----------------------------------------+----------+ | Variable_name | Value | +----------------------------------------+----------+ | Innodb_row_lock_current_waits | 0 | |

MySQL引擎

你离开我真会死。 提交于 2020-03-02 08:18:06
MySQL提供多种存储引擎,通过命令 show engines; 查看 查看当前默认的存储引擎 show variables like '%storage_engine%'; 查看某个表用了什么引擎 show create table 表名; MyISAM引擎: 没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT或UPDATE数据时即写操作需要锁定整个表。存储了表的行数,SELECT COUNT(*) FROM TABLE时,只需要直接读取已经保存好的值而不需要进行全表扫描,如果表的读操作远远多于写操作且不需要事务支持,那么MyISAM是个好选择。 InnoDB引擎: InnoDB是MySQL默认的引擎,提供对ACID事务的支持,并且实现SQL标准的四种隔离级别,提供行级锁和外键约束,它的设计目的是处理大容量数据库系统,在运行时,Innodb会在内存建立缓冲池,用于缓冲数据和索引。没有保存表的行数,当SELECT COUNT(*) FROM TABLE时,需要扫描全表。使用行级锁不是一定的,如果一个SQL语句不能确定要扫描的范围,InnoDB表同样会锁全表。 MyISAM引擎索引实现 B+树作为索引结构,叶节点的data域存放的是数据记录的地址。 主键索引原理图: 辅助索引: InnoDB引擎索引实现 同样使用B+树作为索引结构。MyISAM索引文件和数据是分离的

mysql索引创建&查看&删除

家住魔仙堡 提交于 2020-03-02 07:38:04
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执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。 利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时

mysql查看数据表索引信息

白昼怎懂夜的黑 提交于 2020-03-02 07:37:32
查看索引 mysql> show index from tblname; mysql> show keys from tblname; · Table 表的名称。 · Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。 · Column_name 列名称。 · Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。 · Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。 · Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。 · Null 如果列含有NULL,则含有YES。如果没有,则该列含有NO。 · Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 · Comment 来源: https://www.cnblogs.com