1 ,MySQL索引介绍
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候,索引可以大大加快查询的速度
1,索引的概述
- 数据库索引
-
- 是一个排序的列表,存储着索引值和这个值所对应的物理地址
- 无须对整个表进行扫描,通过物理地址就可以找到所需数据
- 是表中一列或者若干列值排序的方法
- 需要额外的磁盘空间,
2,索引的作用
- 数据库利用各种快速定位技术,能够大大加快查询速率
- 当表很大或查询涉及到多个表时,可以成干上万倍地提高查询速度
- 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
3,索引的分离
- 普通索引
- 最基本的索引类型,没有唯一性之类的限制
- 创建普通索引的方式
1,如何创建索引
先创建一个表
CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
grade VARCHAR(50) );
2, 创建普通索引
在students表的name列上创建一个普通索引,可以通过以下SQL语句实现:
CREATE INDEX idx_name ON students(name);
这里,idx_name是给索引起的名字,用于标识这个索引,方便后续的维护和管理。ON students(name)指定了索引要创建的表名和列名。
3, 索引的类型
除了普通索引之外,MySQL还支持多种类型的索引,以满足不同的需求:
- 唯一索引(UNIQUE INDEX):保证索引列的值唯一,允许有空值。创建方式与普通索引类似,但需要在CREATE INDEX语句前加上UNIQUE关键字。
CREATE UNIQUE INDEX uniq_idx_name ON students(name);
- 主键索引(PRIMARY KEY)
:是一种特殊的唯一索引,不允许有空值。通常在创建表时指定某列为主键,MySQL会自动为这个列创建主键索引。
- 全文索引(FULLTEXT INDEX)
:用于在文本数据中进行全文搜索。全文索引只能在CHAR、VARCHAR或TEXT类型的列上创建。
CREATE FULLTEXT INDEX ft_idx_grade ON students(grade);
- 组合索引(复合索引):在表的多个列上创建索引。MySQL可以使用组合索引来加速查询,只要查询条件中包含了组合索引的最左前缀列。
CREATE INDEX idx_name_age ON students(name, age);
4,查看索引
show index form students\G
5,删除索引
1,MySQL 事务
在SQL中编写一个详细的事务通常涉及几个关键步骤:开始事务、执行一系列操作(可能是插入、更新、删除等)、以及根据操作的成功与否来决定是提交事务还是回滚事务。
mysql> set autocommit=0; #使用Innodb数据库引擎
Query OK, 0 rows affected (0.00 sec)
mysql> use auth;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> create table kgc_transaction_test (id int(5)) engine=innodb; #创建一个表
Query OK, 0 rows affected (0.01 sec)
mysql> select * from kgc_transaction_test; #查询数据
Empty set (0.01 sec)
mysql> begin #开始事务
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into kgc_transaction_test value (1); #添加数据
Query OK, 1 row affected (0.00 sec)
mysql> insert into kgc_transaction_test value (2);
Query OK, 1 row affected (0.00 sec)
mysql> commit; #提交事务
Query OK, 0 rows affected (0.00 sec)
mysql> select * from kgc_transaction_test;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
mysql> begin; #开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into kgc_transaction_test value (3);
Query OK, 1 row affected (0.00 sec)
mysql> rollback; #回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from kgc_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
mysql>