首页 > 数据库 >MYSQL数据库 索引、事务

MYSQL数据库 索引、事务

时间:2023-09-04 10:23:45浏览次数:35  
标签:组合 创建 数据库 查询 索引 MYSQL 可以 主键

索引

定义:

索引是对数据库表中一列或多列的值进行排序的一种结构(类似书的目录)。MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度

索引的优点:

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  2. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点:

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
  4. 如果给不合适创建索引的列创建了索引,不会提高性能。

哪些列应该创建索引?

  1. 列的选择性:对于选择性高的列创建索引,可以大大提高查询效率。
  2. 查询效率:对于经常被用于查询的列,特别是大表的查询,应该创建索引。
  3. 数据量大小:对于数据量大的表,可以考虑创建索引。
  4. 经常被用于连接的列:对于经常与其他表进行连接的列,可以考虑创建索引。
  5. 经常出现在WHERE子句中的列:对于经常出现在WHERE子句中的列,特别是大表的列,应该创建索引。
  6. 对于主键或外键,必须创建索引。
  7. 对于经常被用于排序、分组、去重等操作的列,可以考虑创建索引。
  8. 对于经常被用于子查询、联合查询等操作的列,可以考虑创建索引。

哪些列不应该创建索引?

  1. 列的选择性:对于选择性低的列,创建索引可能不会提高查询效率。
  2. 数据量大小:对于数据量小的表,可以考虑不创建索引。
  3. 修改频率:对于经常被修改的列,可以考虑不创建索引,因为索引的维护成本较高。
  4. 查询效率:对于查询效率已经很高的列,可以考虑不创建索引。
  5. 对于定义为text、image、bit等数据类型的列,应该避免创建索引。
  6. 对于经常被用于查询,但是数据量很少的列,可以考虑不创建索引。

索引的分类:

索引类型描述
普通索引 默认索引,无限制,可用于提高查询效率
唯一索引 限制索引的值必须唯一,但允许有空值
主键索引 一种特殊的唯一索引,用于标识数据库记录的唯一性,不允许重复且不允许为空
组合索引

一个组合索引包含两个或两个以上的列,组合索引“最左原则”

普通索引

语法:

CREATE INDEX index_name
ON table_name (column1, column2, ...)
其中:
  • index_name 是索引的名称,可以自定义,但最好具有含义性。
  • table_name 是要创建索引的表名。
  • (column1, column2, ...) 是要包含在索引中的列名,可以指定多个列。

普通索引是一种常见的索引类型,允许在数据表中的任意列中出现重复值,并且可以加快对数据的访问速度。

例如,假设有一个名为"users"的表,其中有一个名为"email"的列,我们想要提高根据email进行查询的速度,那么可以创建普通索引。

创建普通索引的SQL代码如下:

CREATE INDEX idx_users_email ON users (email);

上述代码将在"users"表的"email"列上创建一个名为"idx_users_email"的普通索引。

通过创建普通索引,数据库系统可以更快地查找到特定email的用户信息,从而提高查询效率。

唯一索引

语法:

CREATE UNIQUE INDEX indexName
ON tableName (columnName(length));

注意:

  • 如果表中的某列不允许出现重复值,就应该对其创建唯一索引。
  • 可以将唯一索引作用域一个或多个列上,这些列或列的组合必须唯一。
  • 同一张表允许创建多个唯一索引。
  • 唯一索引的列允许空值。
  • 使用 INSERT 和 UPDATE 向唯一索引列生成重复值会报错。

举例:

在 "student" 表的 "phone" 列上创建唯一索引:

CREATE UNIQUE INDEX idx_student_phone
ON student (phone);

主键索引

语法:

ALTER TABLE table_name
ADD PRIMARY KEY (column);

其中,table_name 是要创建主键索引的表名,column 是要指定为主键索引的列名。

需要注意的是,每个表只能有一个主键索引,且主键索引的值必须唯一,不能为 NULL。如果表中的某列已经指定为 PRIMARY KEY,那么可以省略 PRIMARY KEY 关键字。

举例:

假设有一个名为 "users" 的表,其中有一个名为 "id" 的列,我们想将其设置为该表的主键索引,可以使用以下SQL语句:

ALTER TABLE users
ADD PRIMARY KEY (id);

上述代码将在 "users" 表的 "id" 列上创建一个名为 "PRIMARY" 的主键索引。

组合索引

语法:

CREATE INDEX indexName
ON tableName (column1, column2, ...);

在上述语法中,indexName 是索引的名称,tableName 是要创建索引的表名,column1column2 等是要包含在索引中的列名。

组合索引是多列组合建立的索引,可以涵盖多个列,列的顺序按照查询频率进行排序。组合索引可以提高查询效率,特别是在查询语句中同时涉及到这些列时。

需要注意的是,虽然组合索引可以提高查询效率,但是它也有一些负面影响。例如,组合索引的维护成本比单列索引要高,并且可能会对插入和更新操作产生一定的影响。因此,在创建组合索引时需要权衡利弊。

举例:

下面是一个创建组合索引的例子:

假设有一个名为 "orders" 的表,其中包含 "order_date" 和 "customer_id" 两个列,我们想创建一个组合索引,按照日期排序,然后按照客户ID排序。可以使用以下SQL语句:

CREATE INDEX idx_orders_date_customer
ON orders (order_date, customer_id);

上述代码将在 "orders" 表上创建一个名为 "idx_orders_date_customer" 的组合索引,包含 "order_date" 和 "customer_id" 两个列。

这个组合索引可以用于以下查询:

  • 查询某个日期的订单:SELECT * FROM orders WHERE order_date = '2023-07-01'。
  • 查询某个客户的所有订单:SELECT * FROM orders WHERE customer_id = 1234。

 

标签:组合,创建,数据库,查询,索引,MYSQL,可以,主键
From: https://www.cnblogs.com/yund/p/17676167.html

相关文章

  • 1数据库模式
    数据库分三级模式外模式:用户试图应用程序(外模式与概念模式映射),数据库展示内容,用户视图概念模式:基本表,逻辑模式,核心,外模式数据是从概念模式来的内模式:物理存储文件(基本表存在内模式:概念模式与内模式映射) 关系有3中类型基本关系查询表试图表:从基本表和其他视图导出来的表,虚......
  • LightDB数据库支持datetime类型
    在MySQL中datetime存储包含日期和时间的值。当从datetime列查询数据时,MySQL会以以下格式显示datetime值:YYYY-MM-DDHH:MM:SS。默认情况下,datetime的值范围为1000-01-0100:00:00至9999-12-3123:59:59。当前在LightDB数据库(包括LightDB-X和LightDB-A)已经支持了datetime类型,其实......
  • 数据库的基本操作
    1.数据库的操作1.打开数据库-uroot:root为账号-p123456:123456为密码-h127.0.0.1:为地址mysql-uroot-p123456-h127.0.0.12.退出数据库exit\qquit3.注释符#/***/--4.数据库的增删改查增:createdatabasemydata;删:dropdatabasemydata;改:alterdata......
  • xunsearch 搜索时按字段索引词加权
    在使用Xunsearch进行搜索时,我们可以通过XSSearch::addWeight针对某个字段添加权重索引词。该字段是否包含这个词都不影响搜索匹配结果,但如果包含会参与计算结果权重,使结果的相关度更高。常用于针对某一类数据提升搜索结果排序位置。如搜索包含"杭州"的结果,并且提升subjec......
  • fastadmin数据库改动后手工修改相关文件
    在项目开发过程中了,或二次开发时,项目的MVC文件已经做了大量的修改,不能直接使用后台的一键生成CURD来重新生成相关的文件了。需要我们手工去改相关的文件了。比如:数据库状态字段的值做了修改,去掉了其中一项。1、控制器->C检查关联查询/数据限制有没有配置,这个涉及关联数据能不能......
  • 现在的数据库的设计是越来越霸道了
    对现在数据库的设计方式慢慢的理解了,尤其是MySQL这样的容器化数据库在很多应用场景被应用后,某些互联网场景是应用的是得心应手,而到了一些传统行业MySQL并不是一个好的选择开始,理解了其他新老数据库都开始了霸道的设计,数据库的风向标变了。从老说起,商业看Oracle ,SQLServer,......
  • 电商类面试问题--01Elasticsearch与Mysql数据同步问题
    在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进行全量数据同步操作,以确保数据的一致性。而在停止服务......
  • 电商类面试问题--01Elasticsearch与Mysql数据同步问题
    在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进行全量数据同步操作,以确保数据的一致性。而在停止服务时......
  • MySql中 BufferPool 的基本概念介绍
    MySQL的BufferPool是MySQL数据库引擎用来缓存数据页(页是磁盘上的一块固定大小的数据单元)的内存区域。BufferPool在MySQL服务器启动时被初始化,然后在整个数据库生命周期中用于高效地管理数据库页的读取和写入。BufferPool是MySQL性能的关键组成部分之一,因为它可以显著减少与磁盘I......
  • MySQL的优化,三大范式和事务的四大特性
    优化1.对查询进行优化,要尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2.应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描3.应尽量避免在where子句中使用notin或or或!=或<>操作符,否则将引擎放......