mysql索引和事务的使用解读
作者:阿萨德791
mysql索引介绍
索引概述
在 MySQL 中,索引是一种特殊的数据结构,它能够显著提高数据库的查询效率。简单来说,索引就像是书籍的目录,通过目录可以快速找到所需内容的位置,而不必逐页翻阅整本书。在数据库中,索引能够帮助数据库系统快速定位到表中符合条件的数据行,从而减少了数据的扫描量,提高了查询速度。
索引本质上是一种排序好的数据结构,它存储了表中某些列的值以及这些值对应的物理地址。当执行查询时,数据库系统首先在索引中查找符合条件的值,然后根据索引中记录的物理地址直接访问对应的数据行,这样就避免了全表扫描,大大提高了查询效率。
索引作用
索引在数据库中起着至关重要的作用,主要体现在以下几个方面:
- 提高查询效率:这是索引最主要的作用。通过索引,数据库系统可以快速定位到符合条件的数据行,减少了数据的扫描量,从而显著提高查询速度。特别是在处理大量数据时,索引的优势更加明显。
- 加速排序和分组操作:在进行排序(ORDER BY)和分组(GROUP BY)操作时,如果相关列上有索引,数据库系统可以直接利用索引的有序性进行排序和分组,而不必进行额外的排序操作,从而提高了这些操作的效率。
- 保证数据的唯一性:唯一索引和主键索引可以保证表中数据的唯一性。当向表中插入数据时,数据库系统会自动检查索引列的值是否已经存在,如果存在则会拒绝插入,从而保证了数据的唯一性。
- 减少 I/O 操作:由于索引通常比表数据小得多,因此在查询时可以将索引加载到内存中,减少了磁盘 I/O 操作,提高了查询性能。
索引分类
MySQL 提供了多种类型的索引,每种索引都有其特定的应用场景。
下面介绍几种常见的索引类型:
普通索引
普通索引是最基本的索引类型,它没有任何特殊的限制。普通索引可以创建在单个列上,也可以创建在多个列上(组合索引)。创建普通索引的目的主要是为了提高查询效率。
创建普通索引的语法如下:
CREATE INDEX index_name ON table_name(column_name); CREATE TABLE table_name ( column1 datatype, column2 datatype, ... INDEX index_name (column_name) );
唯一索引
唯一索引与普通索引类似,但它的主要特点是索引列的值必须唯一,即不允许有重复值。唯一索引可以包含 NULL 值,但每个 NULL 值被视为唯一的。唯一索引通常用于确保数据的唯一性,例如用户表中的邮箱地址、手机号码等字段。
创建唯一索引的语法如下:
CREATE UNIQUE INDEX index_name ON table_name(column_name); CREATE TABLE table_name ( column1 datatype, column2 datatype, ... UNIQUE INDEX index_name (column_name) );
主键索引
主键索引是一种特殊的唯一索引,它必须唯一标识表中的每一行数据,且不能包含 NULL 值。每个表只能有一个主键索引。主键索引通常用于定义表的主键,例如用户表中的用户 ID 字段。
创建主键索引的语法如下:
ALTER TABLE table_name ADD PRIMARY KEY (column_name); CREATE TABLE table_name ( column1 datatype PRIMARY KEY, column2 datatype, ... );
组合索引(最左前缀)
组合索引是指在多个列上创建的索引。组合索引的查询效率更高,但它的使用需要遵循 “最左前缀” 原则。最左前缀原则是指在使用组合索引进行查询时,MySQL 会从左到右依次使用索引中的列,直到遇到第一个不满足条件的列为止。
例如,在列(col1, col2, col3)上创建组合索引,查询条件为WHERE col1 = 'value1' AND col2 = 'value2'
时,会使用组合索引;但查询条件为WHERE col2 = 'value2' AND col3 = 'value3'
时,不会使用组合索引,因为没有从最左边的列开始。
创建组合索引的语法如下:
CREATE INDEX index_name ON table_name(column1, column2, column3); CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... INDEX index_name (column1, column2, column3) );
全文索引
全文索引是一种特殊的索引类型,它主要用于在文本数据中进行全文搜索。全文索引可以快速定位包含特定关键词的文本数据,适用于大量文本数据的搜索场景,如文章内容搜索、产品描述搜索等。
需要注意的是,全文索引只适用于 MyISAM 和 InnoDB 存储引擎,并且只能用于 CHAR、VARCHAR 和 TEXT 类型的列。
创建全文索引的语法如下:
CREATE FULLTEXT INDEX index_name ON table_name(column_name); CREATE TABLE table_name ( column1 datatype, column2 datatype, ... FULLTEXT INDEX index_name (column_name) );
使用全文索引进行搜索的语法如下:
SELECT * FROM table_name WHERE MATCH(column_name) AGAINST('search_keyword');
创建索引的原则
在数据库中创建索引时,需要遵循一定的原则,以确保索引的有效性和合理性。以下是一些创建索引的基本原则:
- 选择合适的列创建索引:应该在经常用于查询条件、排序和连接的列上创建索引。例如,在 WHERE 子句中经常出现的列、ORDER BY 子句中使用的列以及 JOIN 操作中涉及的列。
- 避免在小表上创建过多索引:对于数据量较小的表,全表扫描的效率可能比使用索引更高,因此不需要创建过多的索引。过多的索引会增加数据插入、更新和删除的开销,同时也会占用更多的存储空间。
- 控制索引的数量:每个表的索引数量不宜过多,一般建议不超过 5-6 个。过多的索引会影响数据库的性能,特别是在数据插入、更新和删除操作频繁的情况下。
- 注意组合索引的顺序:在创建组合索引时,要根据最左前缀原则合理安排列的顺序。通常将最常作为查询条件的列放在最左边,依次类推。
- 避免在频繁更新的列上创建索引:频繁更新的列会导致索引频繁重建,从而影响数据库的性能。因此,应该避免在频繁更新的列上创建索引。
- 对较长的字符串列使用前缀索引:对于较长的字符串列(如 TEXT、VARCHAR 类型),可以只对前缀部分创建索引,这样可以减少索引的大小,提高索引的效率。创建前缀索引的语法如下:
CREATE INDEX index_name ON table_name(column_name(length));
其中,length 表示前缀的长度。
数据库建立索引的原则
确定针对该表的操作是大量的查询操作还是大量的增删改操作
- 尝试建立索引来帮助特定的查询。检查自己的sql语句问,为那些频繁在where子句中出现的字段建立索引;
- 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间同时复合索引也占磁盘空间;
- 对于小型的表,建立索引可能会影响性能;应该避免对具有较少值的字段进行索引;避免选择大型数据类型的列作为索引。
索引建立的原则
索引查询是数据库中重要的记录查询方法,要不要建立索引以及在那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑下面给出实际生产环境中的一些通用的原则:
- 在经常用作过滤器的字段上建立索引;
- 在SQL语句中经常进行GROUPBY、ORDERBY的字段上建立索引
- 在不同值较少的字段上不必要建立索引,如性别字段;
- 对于经常存取的列避免建立索引;
在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照
- 使用的频度来确定;
- 缺省情况下建立的是非簇集索引,但在以下情况下最好考虑簇复集索引,如含有限数目(不是很少)唯一的列;进行大范围的查询;充分的利用索引可以减少表扫描I/0的次数,有效的避免对整表的搜索。
- 当然合理里的索引要建立在对各种查询的分析和预测中,也取决于DBA所设计的数据库结构
查看索引
在 MySQL 中,可以使用以下几种方法查看表中的索引:
使用 SHOW INDEX 语句:
SHOW INDEX FROM table_name;
该语句会返回表中所有索引的详细信息,包括索引名称、索引类型、索引所在的列等。
使用 SHOW CREATE TABLE 语句:
SHOW CREATE TABLE table_name;
该语句会返回创建表的 SQL 语句,其中包含了表的结构和索引信息。
查询 information_schema.statistics 表:
SELECT * FROM information_schema.statistics WHERE table_name = 'table_name';
该语句会返回表中所有索引的详细信息,包括索引名称、索引类型、索引所在的列等。
删除索引
在 MySQL 中,可以使用以下语法删除索引:
DROP INDEX index_name ON table_name; ALTER TABLE table_name DROP PRIMARY KEY;
需要注意的是,删除索引会影响依赖该索引的查询性能,因此在删除索引之前,应该仔细评估其影响。
mysql事务
事务概述
在 MySQL 中,事务是一组不可分割的 SQL 语句序列,这些语句要么全部执行成功,要么全部执行失败。事务是数据库管理系统中实现数据一致性和完整性的重要机制。
事务具有四个基本特性,通常称为 ACID 特性:
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态。
- 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。也就是说,事务执行前后,数据库的完整性约束必须得到满足。例如,在转账操作中,无论事务执行成功还是失败,两个账户的总金额必须保持不变。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不能被其他事务干扰。每个事务都应该感觉不到其他事务的存在,就好像它们是串行执行的一样。
- 持久性(Durability):一旦事务提交成功,它对数据库所做的修改就会永久保存下来,即使数据库发生故障也不会丢失。
mysql事务处理的俩种方法
MySQL 提供了两种处理事务的方法:隐式事务和显式事务。
隐式事务
隐式事务是指 MySQL 自动为每条 SQL 语句创建一个事务,并在语句执行完成后自动提交或回滚。在隐式事务模式下,每条 SQL 语句都是一个独立的事务,它们之间没有任何关联。
MySQL 默认采用隐式事务模式。在这种模式下,每条 SQL 语句执行后都会自动提交,除非发生错误时会自动回滚。例如:
INSERT INTO users (name, age) VALUES ('John', 30); UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
在上面的例子中,每条 SQL 语句都是一个独立的事务,它们之间没有任何关联。如果第一条 INSERT 语句执行成功,而第二条 UPDATE 语句执行失败,第一条语句的修改不会被回滚。
隐式事务适用于不需要保证多个 SQL 语句原子性的场景,例如简单的查询和单条数据的插入、更新操作。
显式事务
显式事务是指用户手动控制事务的开始、提交和回滚。在显式事务模式下,用户可以将多条 SQL 语句组合成一个事务,确保这些语句要么全部执行成功,要么全部执行失败。
在 MySQL 中,可以使用以下语句来管理显式事务:
- START TRANSACTION 或 BEGIN:用于开始一个事务。
- COMMIT:用于提交事务,将事务中所有的修改永久保存到数据库中。
- ROLLBACK:用于回滚事务,撤销事务中所有的修改,将数据库恢复到事务开始前的状态
- BEGIN或START TRANSACTION:显式地开启一个事务;
- ROLLBACK:又可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
- SAVEPOINT identifier:SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
- RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
- ROLLBACK TO identifier:把事务回滚到标记点;
- SET TRANSACTION:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别 READ UNCOMMITTED 、READ COMMITTED、REPEATABLE READ 和SERIALIZABLE。
下面是一个显式事务的示例:
START TRANSACTION; INSERT INTO users (name, age) VALUES ('John', 30); UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; INSERT INTO transactions (user_id, amount, type) VALUES (1, 100, 'withdrawal'); COMMIT;
简单介绍msyql事务处理主要方法(俩种)
用BEGIN,ROLLBACK,COMMIT来实现
- BEGIN开始一个事务
- ROLLBACK事务回滚
- COMMIT 事务确认
直接用SET来改变MySQL的自动提交模式
SET AUTOCOMMIT=0禁止自动提交 SET AUTOCOMMIT=1开启自动提交
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。