数据库索引是一种提高数据库查询效率的数据结构。它可以快速地定位和访问数据库中的数据,从而大大提高数据库查询的速度和效率。数据库索引可以根据不同的查询需求构造多个索引,以最大化提高查询效率。
数据库索引基于各种字段来创建,在查询时可以通过索引直接找到满足条件的数据,而不需要扫描整个数据表。数据库索引可以分为主键索引、唯一索引、普通索引和全文索引等类型,每种类型的索引具有不同的特点和应用场景。
数据库索引可以基于各种字段创建,但通常基于查询频率高、查询条件复杂或者需要排序的字段来创建索引。
常用的索引字段包括主键、唯一键、外键、常用的查询字段等。
创建主键约束(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 | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
--自己创建的索引
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 | | |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
-- 删除
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)
使用索引查询数据和正常查询一样,但索引保存的数据结构主要为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)
数据库索引可以提高查询效率,但同时也会增加数据表的存储空间和更新数据的时间成本。因此在设计数据库时,需要根据实际情况合理地创建索引,以保证查询效率的同时不影响数据更新和插入的速度。
如果表中的数据经常被修改,索引也需要随之更新,这会带来一定的性能开销。因此,对于不经常使用或值域比较小的字段,不建议创建索引。
同时,一个表的索引可以不只一个,但也应该避免过多的索引,否则会降低数据库的性能。
事务就是逻辑上的一组操作,要么全部成功,要么全部失败,如果有一个操作失败,整个事务就会回滚,恢复到执行前的状态。保证了数据的一致性和可靠性。同时,事务也可以提高数据库的并发性能,并且保证数据的唯一性和隔离性。因此,在高并发、高可用的应用场景下,使用事务是非常重要的。
事务分为四个重要的ACID属性,即:
- 原子性(Atomicity):一个事务中的所有操作,要么全部执行成功,要么全部失败回滚,如同原子一样不可分割。
- 一致性(Consistency):事务执行前后,数据的完整性和一致性必须保持一致。
- 隔离性(Isolation):事务执行的过程中,对数据的操作相互隔离,每个事务都像在独立的环境中执行一样,以避免数据操作之间的相互干扰。
- 持久性(Durability):事务一旦提交,它对数据库中的数据状态的改变是永久性的,即使系统崩溃也不会对其有影响,数据将一直保持到下一个事务修改它为止。
- 开启事务:start transaction;
- 执行多条SQL语句
- 回滚或提交: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;