【MySQL】一文带你了解数据库索引与事务

1. 索引的概念

数据库索引是一种提高数据库查询效率的数据结构。它可以快速地定位和访问数据库中的数据,从而大大提高数据库查询的速度和效率。数据库索引可以根据不同的查询需求构造多个索引,以最大化提高查询效率。
数据库索引基于各种字段来创建,在查询时可以通过索引直接找到满足条件的数据,而不需要扫描整个数据表。数据库索引可以分为主键索引、唯一索引、普通索引和全文索引等类型,每种类型的索引具有不同的特点和应用场景。

2.索引的创建与使用

数据库索引可以基于各种字段创建,但通常基于查询频率高、查询条件复杂或者需要排序的字段来创建索引。
常用的索引字段包括主键、唯一键、外键、常用的查询字段等。

2.1 自动创建对应列的索引

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

-- 查看索引
show index from 表名;
mysql> create table book(id int primary key, name varchar(10), price int);
Query OK, 0 rows affected (0.02 sec)

mysql> show index from book;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| book  |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

mysql> drop table book;
Query OK, 0 rows affected (0.01 sec)

mysql> create table book(id int unique, name varchar(10), price int);
Query OK, 0 rows affected (0.01 sec)

mysql> show index from book;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| book  |          0 | id       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

2.2 自己创建普通索引

--自己创建的索引
create index 索引名 on 表名(字段名);
mysql> create table book(id int, name varchar(10), price int);
Query OK, 0 rows affected (0.02 sec)

mysql> show index from book;
Empty set (0.00 sec)

mysql> create index idx_book_id on book(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from book;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| book  |          1 | idx_book_id |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

2.3 删除索引

-- 删除
drop index 索引名 on 表名;
mysql> show index from book;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| book  |          1 | idx_book_id |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

mysql> drop index idx_book_id on book;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from book;
Empty set (0.00 sec)

2.4 索引查询

使用索引查询数据和正常查询一样,但索引保存的数据结构主要为B+树,及hash的方式,所以当数据非常多的时候,查询速度将会大大增加。

mysql> insert into book values(1,'西游'),
    -> (2,'三国'),
    -> (3,'水浒'),
    -> (4,'红楼'),
    -> (5,'0'),
    -> (6,'1'),
    -> (7,'2');
Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from book where id = 4;
+------+------+
| id   | name |
+------+------+
|    4 | 红楼 |
+------+------+
1 row in set (0.00 sec)

3. 索引的弊端

数据库索引可以提高查询效率,但同时也会增加数据表的存储空间和更新数据的时间成本。因此在设计数据库时,需要根据实际情况合理地创建索引,以保证查询效率的同时不影响数据更新和插入的速度。
如果表中的数据经常被修改,索引也需要随之更新,这会带来一定的性能开销。因此,对于不经常使用或值域比较小的字段,不建议创建索引。
同时,一个表的索引可以不只一个,但也应该避免过多的索引,否则会降低数据库的性能。

4. 事务的概念

事务就是逻辑上的一组操作,要么全部成功,要么全部失败,如果有一个操作失败,整个事务就会回滚,恢复到执行前的状态。保证了数据的一致性和可靠性。同时,事务也可以提高数据库的并发性能,并且保证数据的唯一性和隔离性。因此,在高并发、高可用的应用场景下,使用事务是非常重要的。

5. 事务的特性

事务分为四个重要的ACID属性,即:

  1. 原子性(Atomicity):一个事务中的所有操作,要么全部执行成功,要么全部失败回滚,如同原子一样不可分割。
  2. 一致性(Consistency):事务执行前后,数据的完整性和一致性必须保持一致。
  3. 隔离性(Isolation):事务执行的过程中,对数据的操作相互隔离,每个事务都像在独立的环境中执行一样,以避免数据操作之间的相互干扰。
  4. 持久性(Durability):事务一旦提交,它对数据库中的数据状态的改变是永久性的,即使系统崩溃也不会对其有影响,数据将一直保持到下一个事务修改它为止。

6. 事务的使用

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;

rollback即是全部失败,commit即是全部成功。

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

猜你喜欢

转载自blog.csdn.net/weixin_73392477/article/details/131279950