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

这篇具有很好参考价值的文章主要介绍了【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即是全部成功。文章来源地址https://www.toymoban.com/news/detail-490563.html

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

到了这里,关于【MySQL】一文带你了解数据库索引与事务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL】一文带你彻底了解事务机制

    我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题: 数据库中途突然因为某些原因挂掉了。 客户端突然因为网络原因连接不上数据库了。 并发访问数据库时,多个线程同时写入数据库,覆盖了彼此的更改

    2024年02月09日
    浏览(24)
  • MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

    事务 (transaction):要么都成功,要么都失败。 核心 :将一组 SQL 放在一个批次中去执行。 原则 ACID :原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性 :一个事务中的所有步骤 要么都 成功, 要么都 失败,不能只成功一个步骤。 一致性 :包括

    2023年04月26日
    浏览(64)
  • 一文带你了解MySQL之事务隔离级别和MVCC

    为了我们学习的顺利进行,我们这边创建一张 hero 表 这里需要注意的是,我们的 hero 表的主键是 number ,而不是 id ,主要是后边要用到的 事务id 做一下区别,然后我们给这个表里插入一条数据 现在我们表里的数据就是这样: 我们知道 MySQL 是 CS 架构的软件,若干个客户端与

    2024年02月08日
    浏览(55)
  • 一文带你了解MySQL之B+树索引的使用

    前言 我们上一篇文章详细的了InnoDB存储引擎的B+树索引,我们必须知道下边这些结论: 每个索引都对应1棵B+树,B+树分为好多层,最下边一层是叶字节点,其余的是内节点(非叶子节点)。所有用户户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点。 InnoDB存储

    2024年02月06日
    浏览(29)
  • 【MySQL】数据库中这么多数据类型你真的了解吗?一文看懂不同数据类型有何区别

    创建表t1,将name列数据类型设置为要tinyint 插入属性值:由于这里是tinyint类型,取值范围是【-128–127】,当插入这个范围内的数据显示成功,范围之外失败 使用tinyint unsigned类型创建表t2 无符号类型取值范围【0,255】,这点与C/C++一样 2.1.1 小结 MySQL对于数据类型不合法行为采

    2024年02月13日
    浏览(29)
  • 【数据库】索引与事务

    目录 1、索引 1.1、概念 1.2、索引的作用 1.3、 索引的缺点 1.4、数据库中实现索引的数据结构 1.4.1、B树/B-树 1.4.2、B+树   1.4.3、回表 1.5、使用场景 1.6、索引的使用  1.6.1、查看索引 1.6.2、创建索引  1.6.3、 删除索引 1.7、索引的分类 2、事务 2.1、为什么使用事务 2.2、事务的概

    2024年02月02日
    浏览(32)
  • 【数据库】索引和事务

    目录 1.索引 1.1关于索引 索引是什么? 为什么要有索引? 索引的作用? 索引的优点和缺点? 1.2索引类型及创建 索引的分类 创建索引 1.3索引的数据结构 1.4索引覆盖 2.事务 2.1关于事务 概念 事务的使用 2.2事务的特性 2.3事务的隔离级别 read uncommitted read committed repaeteble read se

    2023年04月25日
    浏览(32)
  • 【MySQL】一文带你了解过滤数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录

    2024年02月09日
    浏览(34)
  • 【MySQL】一文带你了解检索数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月09日
    浏览(33)
  • 【MySQL】一文带你了解数据过滤

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包