多表的连接分为内连接和外连接
内连接实际上利用where子句对两种表形成的笛卡儿积进行选择。之前的查询语句都是内连接。
内连接语法:
select 字段 from [表名称] inner join [表名称] on [连接条件] [其余条件]
外连接分为左外连接和右外连接
联合查询时,左侧的表完全显示就是我们说的左外连接 : select [列名称] from [表名称] left join [表名称] on [连接条件]
联合查询时,右侧的表完全显示就是我们说的右外连接 : select [列名称] from [表名称] right join [表名称] on [连接条件]
常见索引分为:主键索引(primary key) 、唯一索引(unique) 、普通索引(index) 、全文索引(fulltext) : 解决中子文索引问题
索引可提高数据库的性能,只要执行正确的索引创建语句,不用加内存、不用程序、也不用sql ,查询速度就可能提高成千上百倍。但是事物总有两面性,查询速度的提高是以插入、更新和删除的速度为代价的,这些操作,将会增加大量的IO。
索引最受欢迎的地方在于提高海量数据的检索速度。
创建主键索引: 设计了主键就默认设置了主键索引
主键索引特点:
一个表中,做多有一个主键索引,当然除复合主键
创建主键索引的列,它的值不能为null,并且不能重复
唯一索引特点:
一个表中,可以有多个唯一索引,查询效率高。
如果某一列建立唯一索引,必须保证这列不能有重复数据。
如果一个唯一索引指定为not null,等价于主键索引
创建表的同时指明索引列名称 create table student ( id int ,name varchar(10) , index(name) );
create table student ( id int ,name varchar(10))
创建完表之后指定某列为索引: alter table [表名称] add index(列名称)
eg:alter table student add index(name);
在某张表中创建一个索引 : create index [索引名] on [表名称](列名称)
eg: create index index_name on student(name);
上面都是在一张包有学号和姓名的学生信息表中,以姓名的列为索引
特点:一个表中可以有多个普通索引。如果某列需要创建索引,但是该列有重复的值,我们就应该使用普通索引
当对文章字段或有大量文字的字段进行检索时,会使用全文索引。MYSQL提供全文索引机制,但是有要求,要求表的存储引擎必须是MYISAM,而且默认的全文索引支持英文,不支持中文
全文索引的建立:
create table blog(_id int ,_title varchar(255),_text text , fulltext(title,body) )engine=MYISAM;
使用explain工具可以查看选择语句是否使用了索引: explain [选择查询语句]
查询索引:
show keys from [表名]
show index from [表名]
desc [表名]
删除索引:
删除主键索引 : alter table [表名] drop primary key
其他索引的删除: alter table [表名] drop index [索引在的列名称]
drop index [索引所在的列名称] on [表名]
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。
开始一个事务:start transaction
创建一个保存点: savepoint [保存点名]
回到保存点 : rollback to [保存点名]
如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用rollback (前提是事务还没有提交)
如果一个事务被提交了(commit),则不可以回退(rollback)
rollback to [保存点名] 可以选择回退到那个保存点
innoDB支持事务,MyISAM不支持事务
当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的事务在操作数据时,具有隔离性,从而保证数据的一致性
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
读未提交 read uncommited | YES | YES | YES | 不加锁 |
读已提交 read commited | NO | YES | YES | 不加锁 |
可重复读 repeatable read | NO | NO | NO | 不加锁 |
可串行化 serializable | NO | NO | NO | 加锁 |
设置事务的隔离级别:
set session transaction isolation level [隔离级别];
查看当前的隔离级别 : select @@tx_isolation;
mysql 默认的隔离级别是可重复读,一般情况下不要修改
事务的ACID特性:
原子性:事务是应用中最小的执行单位。
一致性:事务执行的结果,必须使数据库从一个一致性,便到另一个一致性状态。当数据库质保函事务成功提交的结果时,数据库出于一致性状态。
隔离性:各个事务的执行互补干扰,任意一个事务的内部操作对其他并发事务都是隔离的。即,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间互相影响
持久性:一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中