mysql聚集索引、辅助索引、覆盖索引、联合索引的使用

yizhihongxing

MySQL中索引是数据库优化的重要手段,常见的索引类型有聚集索引、辅助索引、覆盖索引和联合索引。

聚集索引

聚集索引也叫主键索引,是表中物理存储的排序方式,每个表只有一个聚集索引。聚集索引的叶子节点存储的是数据行本身而非指向数据的指针,因此可以减少一次IO开销。同时使用聚集索引的查询效率也会相应地提高。主键(primary key)约束自动创建聚集索引。

示例:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(20)
) ENGINE=INNODB;

在上面的示例中,我们创建了一个名为users的表,并在id字段上指定了PRIMARY KEY约束,这样系统就会自动为该字段创建一个聚集索引。

辅助索引

辅助索引又称非聚集索引,是除聚集索引以外的索引类型,它对于查询某些不常用的列非常实用。辅助索引的叶子节点存储的是指向数据的指针而非数据行本身,因此需要额外的一次IO操作来获取数据。

示例:

ALTER TABLE users ADD INDEX idx_name(name);

在这个示例中,我们为users表的name字段创建了一个辅助索引。这样在查询name字段时,会非常高效。

覆盖索引

覆盖索引是一种特殊的辅助索引,它包含了查询所需的所有字段,因此查询可以直接通过索引得到需要的数据,而不需要再通过读取数据行来获取数据,从而提高查询效率。

示例:

SELECT name FROM users WHERE id = 1;

在这个示例中,如果我们在id字段上建立了索引,那么查询name字段时就可以直接使用索引,因此可以称之为覆盖索引。

联合索引

联合索引是一个索引包含多个列。当查询中包含这些列的子集时,联合索引就可以被使用。由于聚集索引只能有一个,因此在使用联合索引时需要注意不要把多个索引合并成一个。

示例:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATETIME
) ENGINE=INNODB;

ALTER TABLE orders ADD INDEX idx_customer_date(customer_id, order_date);

在这个示例中,我们为orders表的customer_id和order_date字段创建了一个联合索引。这样便于我们查询某一个用户在某个时间段内的订单情况时,就可以高效地使用该索引了。

总之,掌握MySQL索引类型的特点和使用方法可以提高数据库查询效率,减少查询时间,并优化网站性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql聚集索引、辅助索引、覆盖索引、联合索引的使用 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL循环语句实例教程 mysql while循环测试

    在mysql数据库中操作同样有循环语句操作,标准的循环方式: while 循环 、 loop 循环和repeat循环。还有一种非标准的循环: goto。 鉴于goto 语句的跳跃性会造成使用的的思维混乱,所以不建议使用。 这几个循环语句的格式如下:WHILE……DO……END WHILEREPEAT……UNTIL END REPEATLOOP……END LO…

    MySQL 2023年4月13日
    00
  • MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

    这里我来为大家详细讲解MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法的完整攻略。 1. 背景介绍 在MySQL数据库中,GTID是用于跟踪复制事务的全局唯一标识符。在MySQL5.6及其以上版本中,使用GTID复制模式可以避免数据不一致等问题。 然而,有时候在使用GTID模式下进行同步复制时,可能会出现以下报错: Error ‘Could n…

    database 2023年5月18日
    00
  • SQL 分隔数据转换为多值IN列表

    当我们在进行 SQL 查询时,有时候需要将一个字段中的多个值以 IN 列表的方式传递给查询语句中的 IN 关键字。这时候,我们需要将该字段中的每个元素进行分割然后组成一个 IN 列表,这就是分隔数据转换为多值 IN 列表的操作。下面我们将介绍两个实例,分别用 MySQL 和 PostgreSQL 实现。 MySQL 中的分隔数据转换为多值 IN 列表 假设我…

    database 2023年3月27日
    00
  • redis简单总结

    一、redis的准备。 下载redis:路径:Linux:http://www.redis.io.comwindow:http://www.newasp.net/soft/67186.html 解压后,有5个应用程序: redis-server.exe:服务程序 redis-cli.exe:简单测试redis-check-dump.exe:本地数据库检查 r…

    Redis 2023年4月12日
    00
  • mysql实现多表关联统计(子查询统计)示例

    下面我详细讲解一下“mysql实现多表关联统计(子查询统计)示例”的完整攻略。 什么是多表关联统计? 在关系型数据库中,有时候需要对多个数据表进行统计分析或者计算。此时,就需要使用多表关联查询来实现。多表关联查询就是通过有相同字段连接多张表并将结果集合并在一起,实现更全面、详细的分析效果。 如何通过子查询实现多表关联统计? 在mysql中,我们通过子查询即可…

    database 2023年5月22日
    00
  • Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高

    Mysql数据库中datetime、bigint、timestamp都可以用来存储时间,但它们有不同的特征和适用场景,效率也不同。 datetime: datetime是Mysql用来存储日期和时间的一种数据类型,占用8个字节,可以表示的时间范围大约为1000至9999年,精度为秒。datetime类型存储时间的优点在于精度高,可以精确到秒。缺点在于存储空间…

    database 2023年5月22日
    00
  • MySQL两种临时表的用法详解

    《MySQL两种临时表的用法详解》 什么是临时表 临时表是MySQL中一种非常有价值的工具,它是指一种在数据库连接关闭之前存在且存在于内存或者硬盘中的表。临时表不需要预定义,可以直接创建并使用,同时也是一种非常高效的用来协助完成数据分析任务的工具。 临时表的创建 局部临时表 局部临时表只在创建时所在的会话中存在,会话结束后自动销毁。局部临时表创建的语法如下:…

    database 2023年5月22日
    00
  • mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法

    锁表问题提示:Lock wait timeout exceeded; try restarting transaction 解决锁表方法 查询数据库阻塞的进程SELECT * FROM information_schema.innodb_trx主要看箭头指向的这几个字段,如果有阻塞数据(不为0的就是阻塞的),找到后在根据下图这个字段:try_mysql_th…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部