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

MySQL学习笔记(四)索引-下篇

主键索引叶子节点,存储主键,与对应记录指针;普通索引叶子结点,存储索引列,与对应记录指针。可见,使用普通索引同样能够找到记录,所以MyISAM表中可以没有主键。...系统会在创建该索引时检查是否有重复键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。主键索引一定是唯一性索引,唯一性索引并不一定就是主键。一个表中可以有多个唯一性索引。...联合索引本质上还是一颗B+树,不同联合索引键值数量不是1,而是大于等于2....这说明引用列顺序对于联合索引非常重要。 从上图还可以看出联合索引另一个特点,能对第二个键值排序。对于a=1记录,idx_3逻辑存储顺序是(1,1),(1,2)。...全文索引并不会存储关键字具体匹配在哪一列,如果需要根据不同进行组合查询,那么不需要针对每一列建立多一个这类索引。 来看一个具体例子。

64800

MYSQL优化有理有据全分析(面试必备)

type(重要) 表示表连接类型。 以下连接类型顺序是从最佳类型到最差类型: 1、 system表仅有一,这是const类型特列,平时不会出现,这个也可以忽略不计。...· Using filesort:MySQL需要额外一次传递,以找出如何按排序顺序检索。 · Using index:从只使用索引树中信息而不需要进一步搜索读取实际检索表中列信息。...使用联合索引查询 MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。 ? ? ?...需要考虑数据冗余、查询和更新速度、字段数据类型是否合理等多方面的内容。 将字段很多表分解成多个表 对于字段较多表,如果有些字段使用频率很低,可以将这些字段分离出来形成新表。...禁用唯一性检查 唯一性校验会降低插入记录速度,可以在插入记录之前禁用唯一性检查,插入数据完成后再开启。

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

聚集索引和非聚集索引简析与对比

聚集(clustered)索引,也叫聚簇索引 定义:数据物理顺序与列值(一般是主键一列逻辑顺序相同,一个表中只能拥有一个聚集索引。...第一:聚集索引约束是唯一性是否要求字段也是唯一呢?...第二:为什么聚集索引可以创建在任何一列上,如果此表没有主键约束,即有可能存在重复行数据呢? 粗一看,这还真是和聚集索引约束相背,实际情况真可以创建聚集索引。...既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时索引就形成了覆盖索引,即索引所存储内容就是最终输出数据,这种索引在比以学分为聚集索引做查询性能更好。...我们来比较下主键为聚集索引和非聚集索引查找情况:聚集索引由于索引叶节点就是数据页,所以如果想检查主键唯一性,需要遍历所有数据节点才非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性

1.6K20

从MySQL主键为何单调递增说起

主键(primary key),一列 (或一组列),其值能够唯一区分表中每个。唯一标识表中每行这个列(或这组列)称为主键。主键用来表示一个特定。...,必须更改这个主键) 联合主键 好处 可以直观看到某个重复字段记录条数 主键A跟主键B组成联合主键 主键A跟主键B数据可以完全相同,联合就在于主键A跟主键B形成联合主键是唯一。...联合主键体现在多个表上,复合主键体现在一个表中多个字段。 复合主键 主键通常定义在表一列上,这并不是必需,也可使用多个列作为主键。...表主键含有一个以上字段组成,不使用无业务含义自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题,只要不是有多条记录所有主键值完全一样...因此,我更倾向于使用生成ID作为数据库主键。不单单是因为它唯一性,更是因为一旦生成就不会变更,可以随意引用。

2K30

explain 深入剖析 MySQL 索引及其性能优化指南

7.key_len:索引中被使用部分长度,以字节计。 key_len可以告诉你在联合索引中mysql会真正使用了哪些索引。 ...10.extra:附加信息 Using index和Using where会遇到比较多,可以重点记下,其他我没怎么遇到过了解即可,遇到具体问题可以查阅哈 1)Distinct  一旦MYSQL找到了与行相联合匹配...这种情况下,可以在SELECT语句中使用USE INDEX(indexname) 强制使用一个索引或者用IGNORE INDEX(indexname)强制MySQL忽略索引。...将在表4.3中讨论,这里可以看到例子是Using temporary和Using filesort,意思MySQL根本不能使用索引,结果是检索会很慢。...如果不想返回表中全部,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型解释(按照效率高低顺序排序)。 system 表只有一 system 表。

1.7K60

MySQL索引原理、失效情况

性能相差会很多,所以如果可以在业务端保证数据唯一性,那就可以使用普通索引。...这种情况下,可以在SELECT语句中使用USE INDEX(indexname)强制使用一个索引或者用IGNORE INDEX(indexname)强制MySQL忽略索引。...它根据连接类型以及存储排序键值和匹配条件全部指针排序全部。...如果不想返回表中全部,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型解释(按照效率高低顺序排序)。 system: 表只有一:system表。...(区分度=列中不同数量/列总行数) 3)使用最频繁列放到联合索引左侧(这样可以比较少建立一些索引) 2、表关联查询 1)类型和大小要相同,可以使用索引。

1.1K11

MySQL索引

1.选择唯一性索引      唯一性索引值是唯一可以更快速通过该索引来确定某条记录。     例如,学生表中学号是具有唯一性字段。为该字段建立唯一性索引可以很快的确定某个学生信息。  ...NULL 从左到右,性能从最差到最好 system 表仅有一,这是const类型特列,平时不会出现,这个也可以忽略不计 const 表最多有一个匹配,const用于比较primary key 或者...、Extra 包含不适合在其他列中显示十分重要额外信息 a....有时"Using where"出现就是一个暗示:查询可受益与不同索引。 c. Using temporary   表示MySQL需要使用临时表存储结果集,常见于排序和分组查询 d...., in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引可以是is null(必须在所有列 都满足is null时候),或者=一个值; 当建立索引第一位置是

3.8K50

MySQL插入数据与更新和删除数据

插入多行; 4.插入某些查询结果; - 注意,由于MySQL安全机制,需要注意权限。 插入完整 需要指定插入表名和值。一般插入操作没有返回值,举例, 分析:第一列cust_id为。...注意,虽然此语法简单,并非安全。上面语句高度依赖表中列次序。即使可以得到这些信息,但不能保证下次使用时,表次序因为种种原因经过调整,引起输入错误。...更保险输入方式应该为, 同时,此方式下,自动增量非必须。所以,纵使与表中列次序不同,也可以完成插入操作。因此当比给出列名时候,必须正确给出每列值。...如果表定义允许,可以选择在操作时忽略某些列。忽略列必须满足如下条件, 1. 该列定义为允许; 2. 表中给出默认值; 注意,为避免影响到数据库瞬时速度,可以将插入操作降低优先级。...要更新表; 列名和他们新值; 确定要更新过滤条件。 更新表中所有; 更新表中特定

2.4K60

【Mysql进阶-2】图文并茂说尽Mysql索引

联合索引依然是B+树,联合索引健值数量不是一个,而是多个。构建一颗B+树只能根据一个值构建,因此数据库依据联合索引最左字段构建B+树。...(a值确定时,b是有序,因此可以使用联合索引) SELECT * FROM table WHERE a=1 AND b>3; 3、精确匹配最左列并范围匹配非右一列(a值确定时,c排序依赖b,因此无法使用联合索引...不过,能坚持读下来朋友,你收获也一定良多。接下来内容就轻松愉悦多了。 2 索引正确使用姿势 索引优点如下: 通过创建唯一索引可以保证数据库表中每一数据唯一性。...唯一索引:唯一索引与普通索引类似,不同是创建唯一性索引目的不是为了提高访问速度,而是为了避免数据出现重复。唯一索引列值必须唯一,允许有空值。如果是组合索引,则列值组合必须唯一。...一个表可以有多个单列索引,这些索引不是组合索引。一个组合索引实质上为表查询提供了多个索引,以此加快查询速度。

95020

MySQL Explain关键字

二、Explain可以干什么 1、查看表读取顺序 2、数据读取操作操作类型 3、哪些索引可以使用 4、哪些索引被实际引用 5、表之间引用 6、每张表有多少被优化器查询 三、Explain 执行后返回信息...①id 相同,执行顺序由上至下 ②id 不同,id 不同,如果是子查询,id 序号会递增,id 值越大优先级越高,越先被执行 ③有相同也有不同 id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中...一个 sql 查询趟数越少越好。 2、select_type select_type 代表查询类型,主要是用于区别普通查询、联合查询、子查询等复杂查询。...SYSTEM 表只有一记录(等于系统表) ,这是 CONST 类型特列,平时不会出现,这个也可以忽略不计 const 表示通过索引一次就找到了,const 用于比较 primarykey 或者 unique...ref 非唯一性索引扫描,返回匹配某个单独值所有.本质上也是一种索引访问,它返回所有匹配某个单独值,然而,它可能会找到多个符合条件,所以他应该属于查找和扫描混合体。

1.7K20

mysql创建索引原则

在mysql中使用索引原则有以下几点: 1、 对于查询频率高字段创建索引; 2、 对排序、分组、联合查询频率高字段创建索引; 3、 索引数目不宜太多 原因:a、每创建一个索引都会占用相应物理控件...可以使用explain检测索引是否被启用 如:explain select * from Student where StudentNo = 1000; 5、选择唯一性索引...唯一性索引值是唯一可以更快速通过该索引来确定某条记录。...例如,学生表中学号是具有唯一性字段。为该字段建立唯一性索引可以很快的确定某个学生信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。...例如,对一个CHAR(100)类型字段进行全文检索需要时间肯定要比对CHAR(10)类型字段需要时间要多。 7、尽量使用前缀索引 如果索引字段值很长,最好使用值前缀索引。

2.4K10

数据库有哪些索引

什么是索引 根据索引类型,可以分成主键索引和二级索引(非主键索引) ? 主键索引:主键索引是叶子结点保存主键对应全部数据, 在 InnoDB 中,主键索引,也被叫做聚簇索引。...什么是覆盖索引 场景:10W条数据,我要从其中查出100条不连续数据,给你id,查name和password进行展示,如何才能高性能去使用?...联合索引 在某一列上加索引以提升相关语句查询效率,联合索引就是在多个列上加索引。...主键和索引有什么区别 主键索引 主键是一种约束,唯一索引是一种索引,两者在本质上是不同。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。...), 可以在索引遍历过程中,对索引中包含字段先做判断,直接过滤掉不满足条件记录,减少回表次数 不使用索引下堆: 根据(username,is_del)联合索引查询所有满足名称以“张”开头索引,然后回表查询出相应全行数据

2.1K50

简单了解SQL性能优化工具MySql Explain

了解Explain 执行计划依赖于表,列,索引等细节和where中条件,mysql优化器利用多种技术有效执行一条sql中查询语句,比如在大表中一个查询可以不通过全表扫描完成。...如果这一列用来说明是其他联合结果,该值可能为null。...此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同是,它用在关联操作只使用了索引最左前缀,或者索引不是UNIQUE和PRIMARY KEY。...使用唯一性索引或主键查找时会发生 (高效) const:当确定最多只会有一匹配时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。...Using filesort MySQL有两种方式可以生成有序结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,注意虽然叫filesort并不是说明就是用了文件进行排序

1.5K20

MySQL索引详解

可以使用前缀索引来减少索引长度,从而提高索引效率。需要注意是,使用前缀索引可能会降低查询准确性。...只需要搜索 ID 这棵 B+ 树; 这个不同带来性能差距会有多少呢?答案是,微乎其微。 InnoDB 数据是按数据页为单位读写。...对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束。比如,要插入 (4,400) 这个记录,就要先判断现在表中是否已经存在 k=4 记录,而这必须要将数据页读入内存才能判断。...确定下一步所搜方向,如果name相同再依次比较age和sex,最后得到检索数据;当(20,F)这样没有name数据时候,b+树就不知道下一步该查哪个节点,因为建立搜索树时候name就是第一个比较因子...比如当(张三,F)这样数据检索时,b+树可以用name指定搜索方向,下一个字段age缺失,所以只能把名字等于张三数据都找到,然后再匹配性别是F数据了, 这个是非常重要性质,即索引最左匹配特性

1.3K392

【MySQL】MySQL数据库初阶使用

所以如果有大量读写并发场景,则建议使用InnoDB存储引擎,该存储引擎支持级锁定,只锁定表中某一数据,其他未锁定依旧可以进行高并发CURD操作,效率会变得比较高,同时会增加数据库系统开销和负责度...实际在建表,给某一列字段分配具体数据类型时候,一定要结合具体使用场景分配,如果你分配不够合理,则很可能会出现空间浪费情况,比如某一列只需要1字节即可完成数据存储,你却用了bigint属性,那存储一条数据就会浪费...other列什么属性都没有带,则sql默认会给他带上一个default属性,该属性字段值为null,所以在插入数据时候,values右边可以忽略掉other列,忽略掉这一列,则实际插入数据时,该列字段使用默认值...一张表中往往有多个字段需要唯一性标识,一张表只能有一个主键,一张表可以有多个唯一键,所以唯一键就可以很好约束表中多个需要唯一性标识字段,唯一键和主键比较相似,从功能上来讲,唯一键允许为空null,...主键不允许为空null,不过空字段是不做唯一性比较,判断表中唯一键是否重复时,NULL肯定是不作比较,这非常合理。

31930

【mysql系列】细谈explain执行计划之“谜”

因为只匹配一数据,所以如果将主键置于where列表中,mysql能将该查询转换为一个常量 3.eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...简单查询不会出现该类型 4.ref:非唯一性索引扫描,返回匹配某个单独值所有,本质上也是一种索引访问,是使用普通索引或者唯一性索引部分前缀,它返回所有匹配某个单独值,可能会找多个符合条件,...ref: 显示索引一列被使用了,如果有可能是一个常数,哪些列或常量被用于查询索引列上值 rows: 根据表统计信息以及索引选用情况,大致估算出找到所需记录所需要读取行数 filtered: 指返回结果占需要读到...system 只有一条数据系统表 或 衍生表只有一条数据主查询才会出现,可以忽略掉,没有太大意义。 ?...ref 相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引部分前缀,索引要和某个值相比较,可能会找到多个符合条件。 ?

88310

Mysql索引:图文并茂,深入探究索引原理和使用

联合索引依然是B+树,联合索引健值数量不是一个,而是多个。构建一颗B+树只能根据一个值构建,因此数据库依据联合索引最左字段构建B+树。...(a值确定时,b是有序,因此可以使用联合索引) SELECT * FROM table WHERE a=1 AND b>3; 3、精确匹配最左列并范围匹配非右一列(a值确定时,c排序依赖b,因此无法使用联合索引...不过,能坚持读下来朋友,你收获也一定良多。接下来内容就轻松愉悦多了。 ? 2 索引正确使用姿势 索引优点如下: 通过创建唯一索引可以保证数据库表中每一数据唯一性。...唯一索引:唯一索引与普通索引类似,不同是创建唯一性索引目的不是为了提高访问速度,而是为了避免数据出现重复。唯一索引列值必须唯一,允许有空值。如果是组合索引,则列值组合必须唯一。...一个表可以有多个单列索引,这些索引不是组合索引。一个组合索引实质上为表查询提供了多个索引,以此加快查询速度。

78610

MySQL主键详解

主键(primary key) 一列 (或一组列),其值能够唯一区分表中每个。唯一标识表中每行这个列(或这组列)称为主键。主键用来表示一个特定。...没有主键,更新或删除表中特定很困难,因为没有安全方法保证只涉及相关而不误伤其他! 一个顾客表可以使用顾客编号列,而订单表可以使用订单ID,雇员表可以使用雇员ID或雇员社会保险号。...,必须更改这个主键) 联合主键 好处 可以直观看到某个重复字段记录条数 主键A跟主键B组成联合主键 主键A跟主键B数据可以完全相同,联合就在于主键A跟主键B形成联合主键是唯一。...联合主键体现在多个表上,复合主键体现在一个表中多个字段。 复合主键 主键通常定义在表一列上,这并不是必需,也可使用多个列作为主键。...表主键含有一个以上字段组成,不使用无业务含义自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题,只要不是有多条记录所有主键值完全一样

4.9K20

❤『知识集锦』一文搞懂mysql索引!!(建议收藏)

性能相差会很多,所以如果可以在业务端保证数据唯一性,那就可以使用普通索引。...这种情况下,可以在SELECT语句中使用USE INDEX(indexname)强制使用一个索引或者用IGNORE INDEX(indexname)强制MySQL忽略索引。...它根据连接类型以及存储排序键值和匹配条件全部指针排序全部。...如果不想返回表中全部,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型解释(按照效率高低顺序排序)。 system: 表只有一:system表。...2)区分度最高放在联合索引最左侧(区分度=列中不同数量/列总行数)       3)使用最频繁列放到联合索引左侧(这样可以比较少建立一些索引) (2)表关联查询       1)类型和大小要相同

74420
领券