首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySql索引类型

MyISAM还采用压缩机制存储索引,比如,第一个索引为“her”,第二个索引为“here”,那么第二个索引会被存储为“3,e”,这样的缺点是同一个节点中的索引只能采用顺序查找。...myisam引擎的数据在物理磁盘上是按照顺序存储的,而innodb引擎的表数据是随机分布的; MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。...第二个与MyISAM索引的不同是InnoDB的 辅助索引data域存储相应记录主键的值而不是地址 。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...在InnoDB表中按主键顺序插入行 如果正在使用InnoDB并且没有什么数据需要聚集,那么可以定义一个代理键作为主键,这种主键的数据应该和应用无关,最简单的方法是使用AUTO_INCREMENT自增列...id; 由此可以挖掘出一个问题,就是如果Innodb有大数据列,比如 varchar(300),这种比较多的话,那么排序的时候用主键id排序会比较慢,因为id主键下面放着所有数据列,而Myisam就不需要扫描数据列

1.6K10

MySQL数据库:索引的实现原理

按范围存取的列或者在group by或order by中使用的列,因为索引已经排序,这样可以利用索引加快排序查询时间。...IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以范围查询、排序等操作,B+树有着更高的性能。...,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。...(2)辅助索引: 第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...而使用自增字段作为主键则是一个很好的选择。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    详解B+树及其正确打开方式

    在多个页中的查找 不管是否以主键作为搜索提交,都不能使用数据页中的目录进行二分查找,只能顺序查找,逐一对比。 结果:这样查找速度肯定是慢的,我们得想一个提升速度的方法,那么索引就出现了。...我们先来创建一个表score,并为其新增三条语句,语句如下: create table score( id varchar(10), name varchar(10), score int, primary...第四个和第五个都能命中联合索引,最左前缀原则是针对索引的顺序,和SQL语句的前后顺序无关。 后面两个主要是用于排序的,如果SQL语句中有根据某个字段排序,尽量让其在索引层面完成排序。...回到刚才的SQL语句,如果按name排序,则可以使用索引,因为索引是先按name排序,再按score索引的。...但是如果按score排序,则不可以使用索引,因为score是后面排序的,也就是只有name一样才会按score排序,但是SQL语句需要的是全量的按照score排序。

    68310

    MySQL数据库完整知识点梳理----保姆级教程!!!

    null和is not null的使用 安全等于 排序查询 语法 添加筛选条件: 按表达式排序: 按别名排序: 按函数排序: 按多个字段排序: 总结 常见函数 调用 分类 单行函数 字符函数...分组前筛选 分组后筛选 注意 按表达式,函数和别名分组---只有mysql支持 按照多个字段分组,多个字段间用逗号隔开 添加排序---放在分组排序最后 分组查询时,除了聚合查询和分组的字段可以查询之外...from stu; 查询表中的多个字段 select name,age from stu; 查询表中的所有字段 select *from stu; //查询顺序与表中字段顺序完全一致 查询常量值 select...); 或者 SELECT*,LENGTH(sname) 姓名 FROM stu ORDER BY 姓名; 按多个字段排序: 先按照dno降序排列,当dno相同时,再按照eid升序排列 SELECT...join 右边的是主表 左外和右外交换两个表的顺序,可以实现同样的效果 可以像内连接一样,去掉outer关键字 ---- 左外连接 演示: 找出girl表中id和Boy表中id所匹配的记录

    6K10

    MySQL底层概述—8.JOIN排序索引优化

    驱动表会直接影响多表连接的关联顺序,也决定后续关联时的查询性能。驱动表的选择遵循一个原则:在对最终结果集没影响的前提下,优先选择结果集最小的表作为驱动表。...:查询主键之外的没有添加索引的字段,不会利用索引排序场景五:排序字段顺序与索引列顺序不一致,无法利用索引排场景六:where条件是范围查询时,不按索引顺序排序会使索引失效场景七:升降序不一致,无法利用索引排添加索引...name和age两个字段,对name与age排序。...,无法利用索引排序使用联合索引时,ORDER BY的排序字段顺序和联合索引列顺序匹配。...Using MRR中的MRR表示:通过范围扫描将数据存入read_rnd_buffer_size,然后对其按主键排序,最后使用排序好的数据进行顺序回表。

    6710

    MySQL优化必备之执行计划explain,索引基本知识,索引数据结构推演

    (按表条件过滤的行百分比) extra Additional information(附加信息) id select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序。...id相同和不同的,同时存在:相同的可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行 还是上面那个例子,先执行id为2的,然后按顺序从上往下执行id为1的。...两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。...mysql索引数据结构---B+Tree B+Tree是在BTree的基础之上做的一种优化,变化如下: 1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变为多个区间...最左匹配 再来以name和age两个字段建组合索引(name, age),然后有这样一个查询: select * from stu where name=?

    1.3K21

    【MySQL】DQL-查询语句全解 (附带代码演示&案例练习)

    id int comment '编号 ', workno varchar(10) comment '工号 ', name varchar(10) comment '姓名...排序方式&注意事项&可cv例题语句 语法&排序方式如下所示: 注意事项: 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。...如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序) select * fron emp order by age asc , entrydate desc; 六.DQL-分页查询 语法...4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。...5.查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。

    29810

    【数据库】MySQL进阶七、limit用法& varchar类型排序

    MySQL中怎么对varchar类型排序问题 asc 升级 desc降序 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍...varchar类型排序问题如何解决。...今天在对国家电话号码表进行排序的时候发现了一个有趣的问题,我想让isdcode字段按照由小到大的顺序排序,于是乎我是这样写的 SELECT * FROM gb_country_isdcode ORDER...在mysql中使用order by对存储了中文信息的字段,默认出来的结果并不是按汉字拼音的顺序来排序,要想按汉字的拼音来排序,需要把数据库的字符集设置为UTF8,然后在order by 时候强制把该字段信息转换成...GBK,这样出来的结果就是按拼音顺序排序的。

    1.5K60

    MySQL随机函数RAND

    CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL,...上述SQL语句的执行过程如下: 创建一个临时表(该表使用的是memory引擎),表里有两个字段,第一个字段是double类型(记为字段R),第二个字段是varchar(64)类型(记为字段W),临时表没有索引...从word表中,按照主键顺序取出所有的word值,对于每一个word值,调用rand函数生成一个大于0小于1的随机小数,把该随机小数和word值存入临时表的R和W字段中,至此扫描行数是10000 临时表目前有...10000行数据,下面需要对这个临时表按照字段R进行排序 初始化sort_buffer,sort_buffer中有两个字段,一个是double类型,另一个是整型 从内存临时表中逐行取出R值和位置信息,分别存入...peak_memory_used代表排序时使用到的内存,按道理应该等于sort_buffer_size指定的值,之所以不等的原因是作者本人的MySQL是8.0.12版本。

    2.5K10

    关于MySQL的若干遗留问题(一)

    1)、varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间, 其次对于查询来说...2)、varchar(50)代表的含义: varchar(50)中50的涵义最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order...int(20)中20的含义: int(20)中20的涵义是指显示字符的长度但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 —00000000010,当字符的位数超过...减去1的原因是实际存储从第二个字节开始,减去2的原因是因为要在列表长度存储实际的字符长度,除以3是因为utf8限制:每个字符最多占用3个字节。 6....[SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点? 前者要解析数据字典,后者不需要 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

    88540

    MySQL学习笔记【基础篇】

    通配符有: % 表示任意多个字符,包含0个字符 _ 表示任意单个字符 between and 注意它包含临界值 两个临界值不要随意调换顺序 in 用于判断某字段的值是否属于in列表中的某一项...【按表达式排序】按年薪的高低显示员工的信息和年薪。...【按别名排序】按年薪的高低显示员工的信息和年薪。...分组函数做条件时肯定是放在having子句后面 能用分组前筛选的,就优先考虑分组前筛选 group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开,没有顺序要求) 也可以添加排序(排序放在整个分组查询的最后...; 不可以为空的字段,必须插入值; 字段个数和值的个数必须一致; 字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致; 修改语句 语法: -- 修改单表语法: update 表名 set 字段=

    2.2K31

    数据库索引原理及优化

    搜索的原理: 若b是空树,则搜索失败,否则: 若x等于b的根节点的数据域之值,则查找成功;否则: 若x小于b的根节点的数据域之值,则搜索左子树;否则:查找右子树 数据结构:二叉排序树 时间复杂度: O(...算法流程: 先选取各块中的最大关键字构成一个索引表; 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。...第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...它的原理也很简单,比如,我们在(a,b,c)字段上创建一个联合索引,则索引记录会首先按照A字段排序,然后再按照B字段排序然后再是C字段,因此,联合索引的特点就是: 第一个字段一定是有序的 当第一个字段值相等的时候...一般来说以下情况可以使用前缀索引: 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。

    62030

    以MySQL为例,详解数据库索引原理及深度优化

    数据结构:有序或无序队列 复杂度:O(n) 实例代码: //顺序查找 int SequenceSearch(int a[], int value, int n) { int i;...算法流程: 先选取各块中的最大关键字构成一个索引表; 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。...第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...它的原理也很简单,比如,我们在(a,b,c)字段上创建一个联合索引,则索引记录会首先按照A字段排序,然后再按照B字段排序然后再是C字段,因此,联合索引的特点就是: 第一个字段一定是有序的 当第一个字段值相等的时候...一般来说以下情况可以使用前缀索引: 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。

    84250

    数据库索引原理及优化

    搜索的原理: 若b是空树,则搜索失败,否则: 若x等于b的根节点的数据域之值,则查找成功;否则: 若x小于b的根节点的数据域之值,则搜索左子树;否则:查找右子树 数据结构:二叉排序树 时间复杂度: O(...算法流程: 先选取各块中的最大关键字构成一个索引表; 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。...第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...它的原理也很简单,比如,我们在(a,b,c)字段上创建一个联合索引,则索引记录会首先按照A字段排序,然后再按照B字段排序然后再是C字段,因此,联合索引的特点就是: 第一个字段一定是有序的 当第一个字段值相等的时候...一般来说以下情况可以使用前缀索引: 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。

    60520

    一文读懂数据库索引原理及优化

    数据结构:有序或无序队列 复杂度:O(n) 实例代码: //顺序查找 int SequenceSearch(int a[], int value, int n) { int i;...算法流程: 先选取各块中的最大关键字构成一个索引表; 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。...第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。...它的原理也很简单,比如,我们在(a,b,c)字段上创建一个联合索引,则索引记录会首先按照A字段排序,然后再按照B字段排序然后再是C字段,因此,联合索引的特点就是: 第一个字段一定是有序的 当第一个字段值相等的时候...一般来说以下情况可以使用前缀索引: 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。

    75430

    MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程

    user( id int primary key auto_increment,//自动增长 username varchar(20) unique, password varchar(20...值的顺序与数据库中表列的顺序一致 值的最大长度不能超过列设置的最大长度 值的类型是字符串或者日期类型,使用单引号引起来 添加记录: 添加某几列: insert into user (id,username...varchar(20), english int, chinese int, math int ); insert into exam values (null,'张三',85,74,91);...逗号分隔条件:按照多个条件进行排序,总是先执行第一个条件,再执行第二个条件,即第一个条件都满足时,走第二个条件 select *from exam order by chinese desc,english...asc;//按照多个条件进行排序,总是先执行第一个条件,再执行第二个条件,即第一个条件都满足时,走第二个条件 查询姓李的学生的信息,按照英语成绩降序 select *from exam where

    3.7K20

    Mysql的SQL优化指北

    联合索引使用问题 B+树中每层节点都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是联合索引的话,则页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序。...字段的排列就会: 先比较字符串的第一个字符,第一个字符小的那个字符串就比较小 如果两个字符串的第一个字符相同,那就再比较第二个字符,第二个字符比较小的那个字符串就比较小 如果两个字符串的第二个字符也相同...server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。 单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。...对于count(字段)来说: 如果这个“字段”是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加; 如果这个“字段”定义允许为null,那么执行的时候,判断到有可能是...所以如果join_buffer_size放不下的话就要使用小表作为驱动表,减少分段放的次数,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量

    98320

    Mysql的SQL性能优化指北

    联合索引使用问题 B+树中每层节点都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是联合索引的话,则页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序。...匹配列前缀 和联合索引其实有点类似,如果一个字段比如是varchar类型的name字段,那么在索引中name字段的排列就会: 先比较字符串的第一个字符,第一个字符小的那个字符串就比较小 如果两个字符串的第一个字符相同...,那就再比较第二个字符,第二个字符比较小的那个字符串就比较小 如果两个字符串的第二个字符也相同,那就接着比较第三个字符,依此类推 所以这样是可以用到索引: CopySELECT * FROM person_info...server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。 单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。...所以如果join_buffer_size放不下的话就要使用小表作为驱动表,减少分段放的次数,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量

    88010

    MySQL快速入门(二)

    自增 # 无符号:id int unsigned 新增表数据的方式 方式1: 按照字段顺序一一传值 insert into t1 values(1,'Hammer'); 方式2:...varchar(32) not null ); # 默认值:所有的字段都可以设置默认值,用户不给该字段传值则使用默认的,否则使用传了的 create table t3( id int...情况一:没有主键和其他约束条件 # InnoDB会采用隐藏的字段作为主键 不能加快数据的查询 情况二:没有主键但是有非空且唯一的字段 # InnoDB会自动将该字段升级为主键 create table...t7( id int not null unique, name varchar(32) ); 外键 外键的存在解决了表内容重点不清晰,重复字段浪费空间,扩展性差等问题; 比如一个员工表内有员工的基本信息...FROM t ORDER BY col1 ASC, col2 DESC, ...; # 首先基于第一个字段进行排序;对于第一个字段排序相同的数据,再基于第二个字段进行排序;依此类推 # 获取部门编号为

    2.6K20

    4.MySQL索引原理

    这个系统有一个会员表 有下列字段: 会员编号 INT 会员姓名 VARCHAR(10) 会员身份证号码 VARCHAR(18) 会员电话 VARCHAR(10) 会员住址 VARCHAR(50) 会员备注信息...则mysql会自动为innodb表生成一个隐含字段作为主键,这字段的长度为6个字节,类型为长整型....接着来讨论两个整型列组成的联合索引,假定两个键值得名称分别为a、b如图 ?...),数据按(a,b)的顺序进行了存放。...(a,b) 索引 联合索引的第二个好处是在第一个键相同的情况下,已经对第二个键进行了排序处理,例如在很多情况下应用程序都需要查询某个用户的购物情况,并按照时间进行排序,最后取出最近三次的购买记录,这时使用联合索引可以帮我们避免多一次的排序操作

    64810
    领券