概述:什么是索引,为什么要有索引?
通俗的讲,新华字典前面的部首与拼音查询就是索引,通过前面的查询,能迅速定位这个字在这本书的什么位置,节省了大量翻找的时间。在庞大的数据库中,当你需要查询某个数据时,没有索引,数据库会遍历整个库的数据查找,浪费了大量的时间与资源,而索引,存储着索引值和这个值所对应的物理地址,查询索引,直接前往对应的物理地址查询数据,快速,便捷。
索引的创建原则:
■表的主键、外键必须有索引
■记录数超过300行的表应该有索引
■经常与其他表进行连接的表,在连接字段上应该建立索引
■唯一性太差的字段不适合建立索引
■更新太频繁地字段不适合创建索引
■经常出现在where子句中的字段,特别是大表的字段,应该建立索引
■索引应该建在选择性高的字段上
■索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
最普通的索引类型,没有唯一性的限制
方法一: CREATE INDEX index_name ON table_name (column(length));
先准备一张兴趣表,它的表结构如下
mysql> use school
Database changed
mysql> create table hob (id int(4) not null,hobby varchar(20) not null);
Query OK, 0 rows affected (0.05 sec)
mysql> desc hob;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(4) | NO | | NULL | |
| hobby | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
创建一个普通索引
mysql> create index index_id on hob (id(4));
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看表结构,Key值有了改变
方法二:
ALTER TABLE table_name ADD INDEX index_name (column(length));
mysql> alter table hob add index index_hobby(hobby);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
方法三:
创建表时创建 关键字 INDEX index_name (title(length))
create table text (
id int(4) not null auto_increment,
title varchar(30) not null,
time int(10) ,
index index_id (id)
);
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一,可以为空,但空值只能出现一次
方法一:CREATE UNIQUE INDEX index_name ON table_name (column(length));
mysql> create unique index t_time on text (time);
方法二: ALTER TABLE table_name ADD UNIQUE index_name (column(length));
mysql> alter table text add unique t_title (title);
方法三: 创建表创建 关键词 UNIQUE INDEX
mysql> mysql> create table tt (id int(4) not null auto_increment primary key,name char(10) not null,score int(4) not null,unique index t_name (name));
Query OK, 0 rows affected (0.02 sec)
mysql> desc tt;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | UNI | NULL | |
| score | int(4) | NO | | NULL | |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
是一种特殊的唯一索引,与唯一索引的区别是不能为空,指定为“PRIMARY KEY”,一个表只能有一个主键
方法一:创建表时创建,关键词PRIMARY KEY
在末尾加主键设定
mysql> create table info (
id int(4) not null,
name varchar(10) not null,
score decimal(5,2),
addr varchar(50) default '未知',
primary key (id));
Query OK, 0 rows affected (0.02 sec)
在字段描述中加入主键描述
create table info (
id int(4) not null primary key,
name varchar(10) not null,
score decimal(5,2),
addr varchar(50) default '未知'
);
mysql> desc info;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(4) | NO | PRI | NULL | |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| addr | varchar(50) | YES | | 未知 | |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
方法二:
ALTER TABLE table_name ADD PRIMARY KEY(column(length));
先创个表
create table cc (id int(4) ,name char(10) not null,score int(4) not null);
mysql> desc cc;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | char(10) | NO | | NULL | |
| score | int(4) | NO | | NULL | |
+-------+----------+------+-----+---------+-------+
添加主键索引
mysql>alter table cc add primary key(id);
mysql> desc cc;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(4) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| score | int(4) | NO | | NULL | |
+-------+----------+------+-----+---------+-------+
可以是单列上创建的索引,也可以是在多列上创建的索引,按照最左原则,从左往右依次执行
方法一:
create table user(
name varchar(9),
age int(3),
sex tinyint(1),
index user(name,age,sex));
方法二:
mysql> create index user on user(name,age,sex);
方法三:
mysql> alter table user add index user(name,age,sex);
可以看到,组合索引的三个字段索引名相同,并且在一个组合索引内部存在顺序。
索引类型为FULLTEXT
可以在CHAR、VARCHAR或者TEXT类型的列上创建
方法一:
create table vip (
id int(4) not null,
name varchar(10) not null,
addr varchar(30) not null,
fulltext index(addr));
方法二:
mysql> create fulltext index addr on vip(addr);
方法三:
mysql> alter table vip add fulltext addr(addr);
方法一:
show index from table_name;
方法二:
show keys from table_name;
方法一:
drop index index_name on table_name;
方法二:
alter table table_name drop index index_name;
概述:什么是事务?
比如银行转账,转账涉及到两个账户,一个账户的数据减少,一个账户的数据增加,且变化的数据 相等,转账是一个完整的操作,事务中的操作是一个整体,分割后,数据就会出现错误,出现钱单方面的减少或增加的现象,转账完成后
原子性(Atomicity)
事务是一个完整的操作,事务的各元素是不可分的
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败
一致性(Consistency)
当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行的事务中,数据可能处于不一致的状态
当事务成功完成时,数据必须再次回到已知的一致状态
隔离性(Isolation)
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性(Durability)
指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中
语句 | 解释 |
---|---|
BEGIN或START TRANSACTION | 开启事务 |
COMMIT | 提交事务 |
ROLLBACK | 回滚 |
SAVEPOINT identifier | 设置断点 |
RELEASE SAVEPOINT identifier | 删除断点 |
ROLLBACK TO identifier | 回滚到断点 |
SET TRANSACTION | 设置事务当中的属性 |
在mysql中,事务是默认提交的,提交MYSQL语句时,自动提交了一个事务,可以看增量备份这篇博客的查看sql文件内容,能看到每一句命令都是begin 与commit的一个过程。
方法一:用BEGIN,ROLLBACK,COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
mysql> use school;
Database changed
创建表
mysql> create table info (id int(4),name varchar(30));
Query OK, 0 rows affected (0.01 sec)
mysql> select * from info;
Empty set (0.00 sec)
事务开始
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
插入数据
mysql> insert into info values (1,'路飞');
Query OK, 1 row affected (0.00 sec)
mysql> insert into info values (2,'索隆');
Query OK, 1 row affected (0.00 sec)
回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
查看一下,没有插入的数据,因为回滚到开始的空表状态了
mysql> select * from info;
Empty set (0.00 sec)
继续插入数据
mysql> insert into info values (3,'白胡子');
Query OK, 1 row affected (0.00 sec)
事务提交
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
查看一下,只有回滚后插入的数据
mysql> select * from info;
+------+-----------+
| id | name |
+------+-----------+
| 3 | 白胡子 |
+------+-----------+
1 row in set (0.00 sec)
方法二:直接用SET来改变MySQL的自动提交模式
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
注意:
set 的方法属于永久的设置方法,当状态为0时,直到重新设置为1,否则接下来的命令都是写在内存当中,使用rollback就能回滚回去,当使用commit提交后,前面的命令存入硬盘,成为提交的数据,但接下来的命令,仍然处于内存中。
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎
●MyISAM
●InnoDB
MySQL数据库中的组件,负责执行实际的数据I/0操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
MyISAM不支持事务,也不支持外键
访问速度快
对事务完整性没有要求
MyISAM在磁盘.上存储成三个文件
●.frm文件存储表定义
●数据文件的扩展名为.MYD (MYData)
●索引文件的扩展名是.MYI (MYIndex)
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少
MyIAM支持的存储格式
●静态表
●动态表
●压缩表
方法1:
alter table 表名 engine=引擎;
方法2:
vi /etc/my.cnf
在[mysqld]配置段内添加,指定默认引擎并重启服务;
default-storage-engine=innoDB
重启mysqld
方法3:创建表时指定引擎
create table 表名 (字段....) engine = 引擎;
方法4:
Mysql_convert_table_format--user=root--password=密码 --sock=/tmp/mysql.sock --engine = 引擎 库名 表名
yum -y install perl-DBI perl-DBD-MySQL
/usr/local/mysql/bin/mysql_convert_table_format --user=root --password='123456' --sock=/tmp/mysql.sock auth