简单的sql语句
建表语句:
CREATE TABLE `student` (
`name` varchar(36) NOT NULL COMMENT '姓名',
`BILL_NO_TYPE` varchar(30) NOT NULL COMMENT '单据类型',
`sex` text CHARACTER COMMENT '性别',
`RECORD_VERSION` int(10) DEFAULT '0' COMMENT '版本号乐观锁'
)
ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='新增表';
查询语句:select * from student
更新语句: update studentset age=? where name=?
删除语句: delete from studentwhere name=?
插入语句: insert into student(name,age,sex) values ('姓名','18','男');
问1:什么是存储引擎?
答:存储引擎这个词只在mysql中存在,是数据的一种存储方式,常见的有innoDB和MyISAM。
mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。
每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎。
问2:INNODB和MySIAM的区别,优缺点分别有哪些?
答: 存储格式:INNODB数据存储在一个文件中xxx.ibd文件,MySIAM用三个文件组织一张表
xxx.frm(存储格式的文件)
xxx.MYD(存储表中数据的文件)
xxx.MYI(存储表中索引的文件)
优缺点:InnoDB支持事务,索引,行级锁,数据的安全有保障。但是数据结构导致它无法被压缩,转为只读文件
MyISAM不支持事务,但是文件可被压缩,节省存储空间,可被转换成只读,提高检索效率。
1、MYISAM是最先的存储引擎,Innodb是mysql5.5版本后的默认数据库;
2、MYISAM采用三种文件的方式组织一张表,三个文件分别存储表的定义,表的数据,表的索引; 所以它可以被压缩,节省存储空间,可以被转换成只读表,提交检索效率; Innodb表结构存储在一个文件中(.frm),数据存储在表空间中(.ibd),无法被压缩,无法被转换成只读; 3、MYISAM支持事务,Innodb支持事务,行级锁,外键;
4、InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。InnoDB支持级联删除和级联更新;
5、INNODB有缓冲池?
问3:什么是索引? 这里是简略回答
答:索引是一种数据结构,inndDB存储引擎通常使用B+树这种结构来构建索引.
B+树(一种数据结构,MySQL索引采用)
1、所有数据均存储在叶子节点上
2、叶子结点之间存在双向链表(该图没画出),索引范围查询较快;
===========================================================================================
2、最左前缀原则:查询尽量从索引的最左列开始,并且不跳过中间列,不然会导致索引失效或者只用到部分索引。
==========================================================================================
问4:什么是数据页?
答:页是存储引擎每次进行磁盘IO的基本数据单位,一般为16KB;
问5:聚簇索引和非聚簇索引的区别?
答:INNODB中,聚簇索引就是按照每个表的主键构造一颗B+树,同时叶子节点存放的就是整张表的数据, 也将聚簇索引的叶子节点称为数据页,这个特性决定了索引组织表中数据也是索引的一部分; 一般建表都会采用一个自增主键做聚集索引,如果没有的话MySQL会默认创建一个 rowid(自增)作为默认主键的;
日常工作中,添加的索引都是辅助索引(二级索引),就是一个为了寻找主键索引而设立的索引,索引的每个叶子节点 都会默认一个存储主键ID,没有主键则存储rowid,可以根据这个到主键索引中找到需要的值,这个操作在mysql中叫做回表;
问6:为什么不建议用UUID做主键?
答:①UUID是无序的,做索引,每次增加都会打乱索引的结构,不想自增主键,每次直接加在后面即可。
②UUID太长了,节省资源。
问7:什么是联合(聚合)索引?
答:多个字段联合建立一个索引,叶子节点顺序存储这几个字段的数据。
所以在使用查询语句的时候,尽量遵守最左前缀原则(延伸点2),不然会导致索引失效;
=============================================================================================
问8:假设一张表中有八条数据1-8,a为主键,select * from a>1是否用到索引,a>6是否用到索引?
答:a>1未用到,a>6用到了,原因是MySQL优化器它计算了用索引和走全表扫描的成本,然后选择性能消耗少的方法
一个需要回表7次,回表也会耗费性能。
问9:什么是覆盖索引?
答:建立的辅助索引(二级索引)中,叶子结点保存索引值和主键值,已经包含了查询需要返回的数据,不需要再进行回表操作,这就是覆盖索引。
问10:什么是索引下推?
答:在二级索引中,根据查询条件进行了二次筛选,减少了回表的行数。
SET optimizer_switch = 'index_condition_pushdown=off'; 关闭索引下推
问11:唯一索引和普通索引的区别?
答:两者在查询时基本没有什么区别,因为索引排序;但是唯一索引在每次更新时会进行查询,判断是否重复。
问12:为什么要使用B+树这种索引?
答:hash索引是使用某种hash算法来查找数据的,这就导致了它无法进行范围查询,不支持排序,不支持模糊查询,B树的叶子节点之间互相独立。
问13:加了索引一定会用到吗?
答:不一定,mysql在执行一条查询sql过程中,有一重优化器,判断哪种查询方式消耗资源更少,就用哪种
比如,一个字段只有两个值,性别男和女,或者boolean值,这种情况下使用和不使用索引都没什么区别,mysql可能就直接用全表扫描了。
问14:描述下索引失效(部分失效)的几种场景?
答:
1、不符合最左前缀原则,比如like语句后面 '%666%'
2、索引的列范围太过于单一,比如boolean
3、如果条件中有or,即使部分条件带索引也不一定用
4、存在索引列的数据类型隐式转换,比如列中的数据类型是字符串,那么查询条件中一定要用引号包起来,否则不使用索引
5、查询条件中存在函数计算
6、order by 不符合顺序会导致部分索引失效
问13:between and,>,<都会用到索引吗?
答:是的。
问14:正确理解MySQL的MVCC及其实现原理
答:关注SnailMann,搜索mvcc