mysql高级

索引?

索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以简单理解为:快速查找排好序的一种数据结构

优势:索引相当于目录一样,可以帮助数据库快速的定位相应数据所在的位置,所以索引大幅度提高了查询效率,降低了数据排序成本,降低了数据库的IO成本,加强了表与表之间的连接。

缺点:就是因为索引是一个独立的表,里面存了主键与索引字段,并且指向实体表的记录,所以也是占空间的。并且虽然有了索引之后查询速度加快了,但是对相应数据更新的速度变慢了,所以对于那些经常需要更新的数据表尽量不要加索引。

Mysql索引?

提高数据库性能,索引是最物美价廉的东西,不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍千倍,但创建索引本身也会占用空间

使用索引优化:create index 索引名称 on 表名(表字段)  //创建索引后,只对创建了索引的列有效,

当我们没有索引查询时为什么会这么慢?

因为进行了全表扫描

使用索引为什么会快?

形成了一个索引的数据结构,比如二叉树,btree

索引的代价?

磁盘占用;对dml语句的有效率影响,会导致更新信息的速度变慢

索引类型?

Mysql索引的类型:主键索引,主键自动的为主索引(类型Primary key

唯一索引:(unique)

普通索引:(index)

全局索引:(fulltext) [适用于MyISAM存储引擎],开发中考虑使用:全局搜索Solr ElasticSearch(ES)

关于索引的sql?

--查询指定表是否有索引show indexes from 表名

--添加唯一索引create  unique  index 索引名称 on 表名(表字段)

--添加普通索引create  index  索引名称  on  表名(表字段)

--添加普通索引方式2): alter table 表名 add  index 索引名称

--添加主键索引:表建好后添加主键索引:alter table 表名 add  primary key (表字段名)

如何选择?如果某列的值,是不会重复的,则优先考虑使用unique索引,否则使用普通索引。

--查询指定表是否有索引:show indexes from 表名

--删除指定表的索引:drop index 索引名称 on 表名

--删除主键索引:Alter table 表名 drop primary key

--修改索引,先删除,在添加新的索引

--查询索引(1) show index from 表名  (2)show indexes from 表名

(3)show keys from 表名

哪些列上适合使用索引?

    1、较频繁的作为查询条件字段应该创建索引

    2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

    3、更新非常频繁的字段不适合创建索引

    4、不会出现在WHERE子句中的字段不该创建索引

Mysql事务

1.事务是什么?

      事务是一组SQL语句,要么全部执行成功,要么全部执行失败。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)

事务的提交:COMMIT

事务的回滚:ROLLBACK

事务的关闭:CLOSE

2.事务的ACID特性?

事务的原子性:

事务是最小单元,不可再分,要么全部执行成功,要么全部失败再回滚。 (  一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,即在某个操作失败后,回滚到事务执行之前的状态。)

事务的一致性:

一致性是指事务必须使数据库从一个一致的状态变到另外一个一致的状态,也就是执行事务之前和之后的状态都必须处于一致的状态。不一致性包含三点:脏读,不可重复读,幻读

事务的隔离性:

隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,即多个并发事务之间要相互隔离

事务的持久性:

      DBMS(数据库管理系统)对数据的修改是永久性的。 事务提交后,对系统的影响是永久的。

3.事务的四个隔离级别?

MySQL数据库的四种事务隔离级别

1.(读取未提交内容)

读取未提交的数据,也被称之为脏读(Dirty Read);

2.(读取提交内容)

3.(可重读)

       这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

       幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

4.Serializable(可串行化)

       这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。

#脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

#不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

#幻读: 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:    

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其它的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

mysql默认的事务隔离级别为repeatable-read

MYSQL视图?

视图概述?

视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,目的:方便用户对数据的操作。

视图的概念?

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,例如,员工信息表,可以用视图只显示姓名、工龄、地址,而不显示社会保险号和工资数等;另一个原因是可使复杂的查询易于理解和使用。视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。视图不是真实表,不保存数据,只是一张虚拟表

如何创建和使用视图?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值