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

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

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

67600

深入理解MySQL索引:优化数据库查询性能的利器

在MySQL中,索引通常基于B树或哈希表(Hash Table)来实现。索引本质上是数据表中一列或多列的有序集合,通过对这些列进行排序,可以大幅提高查询的效率。...确保数据唯一性:索引可以用来强制数据列的唯一性,比如主键索引。 加速排序和分组操作:当查询语句中涉及到ORDER BY、GROUP BY操作时,使用索引可以提高操作的效率。...需要保证唯一性的列:如身份证号、邮箱地址等,这些列往往需要使用唯一索引。 3.2 控制索引的数量 虽然索引能加速查询,但过多的索引会导致写操作的性能下降。....; SHOW INDEX可以查看表中索引的详细信息,而EXPLAIN可以帮助分析查询计划,了解查询是否正确使用了索引。...5.3 忽略联合索引的顺序 在创建联合索引时,忽略列的顺序是一个常见的错误。联合索引的顺序决定了它能否有效地用于查询。错误的顺序可能导致索引无法被使用,甚至影响查询性能。

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

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

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

    1.3K30

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

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

    1.8K21

    MySql的索引学习和使用;(本人觉得足够详细)

    索引:对数据库中一列或多列的值进行排序的一种结构 作用:使用索引可以快速访问数据库表中特定信息(加速检索表中的数据) 优点 1.大大加快数据的检索速度; 2.创建唯一性索引,保证数据库表中每一行数据的唯一性...主键索引 简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。...非聚集索引 也叫非簇索引,在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引。...table product add index(desc(12)); 区分度的计算可以使用count(distinct left(列名, 索引长度))/count(*)来确定 9、区分度高的列适合作为索引...2、数据量小的表最好不要使用索引 3、有大量重复数据的列上不要建立索引 在条件表达式中经常用到的不同值较多的列上建立索引,但字段中如果有大量重复数据,也不用创建索引。

    7610

    【重学 MySQL】六十四、主键约束的使用

    【重学 MySQL】六十四、主键约束的使用 在MySQL中,主键约束(PRIMARY KEY)用于唯一标识表中的每一行数据。...需要注意的是,一张表只能有一个主键,无论是单列主键还是联合主键。 在表创建后添加主键 如果表已经创建但还没有主键,可以通过ALTER TABLE语句来添加主键。...如果是联合主键,则列出所有要组合的列名。 主键约束的删除 如果不再需要主键约束,可以通过ALTER TABLE语句来删除它。...语法如下: ALTER TABLE table_name DROP PRIMARY KEY; 无论是单列主键还是联合主键,都可以使用这条语句来删除主键约束。...注意事项 唯一性检查:在插入或更新数据时,MySQL会检查主键约束列的值是否唯一。如果发现有重复的值,则会报错并拒绝插入或更新操作。 非空性检查:在插入数据时,MySQL会检查主键约束列的值是否为空。

    14710

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

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

    2.1K30

    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.8K60

    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.9K50

    MySQL索引原理、失效情况

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

    1.2K11

    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 索引的正确使用姿势 索引的优点如下: 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。...唯一索引:唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。唯一索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。...一个表可以有多个单列索引,但这些索引不是组合索引。一个组合索引实质上为表的查询提供了多个索引,以此来加快查询速度。

    1.1K20

    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.7K10

    数据库有哪些索引

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

    2.1K50

    MySQL索引详解

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

    2.5K392

    简单了解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 面试题

    全局锁、行级锁、自增锁、记录锁、外键锁、间隙锁、表级锁、元数据锁、意向锁、临键锁MySQL 中有哪些不同的表格?...特点:唯一性、不可为空、自动创建、查询效率高。作用:加速查询、作为外键的参照、性能优化。注意事项:一个表只能有一个主键索引,但一个主键索引可以有多个列组成,即复合主键。...索引,主键,唯一索引,联合索引的区别?唯一性:主键和唯一索引都保证了数据的唯一性,但主键有额外的约束(如不允许NULL值,每个表只能有一个主键)。...MySQL索引的底层原理,是如何实现的?底层原理:基于不同的数据结构,主要包括B+树、哈希表、全文索引(倒排索引)等。不同类型的索引使用不同的数据结构来提高查询效率。...如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表如果一个表有一列定义为TIMESTAMP,将发生什么?每当行被更改时, 时间戳字段将获取当前时间戳。

    10310

    【MySQL】MySQL数据库的初阶使用

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

    34630
    领券