1.mysql事务原理,特性,事务并发控制
2.如何解决高并发场景下的插入重复
3.乐观锁和悲观锁
4.经常使用数据库引擎之间区别
5.mysql索引
6.B-Tree
7.mysql索引类型
8.何时建立索引
9.索引何时失效(模糊匹配,类型隐转,最左匹配)
10.什么是汇集索引和非汇集索引(辅助索引)
11.如何排查和消除慢查询
12.SQL语句编写
内连接(inner join)
外链接(left/right join)
全链接(full join)
13.MyISAM和InnoDB搜索引擎的特色
14.char 和varchar字符串类型的区别?
15.mysql索引相关介绍。
16.MySQL在如下操做场景下会使用索引
17.mysql中随着数据量的增大,查询速度会愈来愈慢,请给出简易的优化方案。
18.关系型数据库中,表与表之间有左链接、内链接、外链接,分别指出他们的含义及区别?python
1.关系型数据库的三范式
2.事务的四大特征
3.mysql数据库最大链接数
4.mysql的分页语句
5.触发器的使用场景?
6.存储过程的优势
7.jdbc调用存储过程
8.简单说一下你对jdbc的理解
9.写一个jdbc的访问oracle的列子
10.jdbc中preparedStatement比Statement的好处
11.数据库链接池的做用
12.ORM是什么?ORM框架是什么?
13.ibatis和hibernate有什么不一样
14.hibernate对象状态及其转换
15.hibernate的缓存
16.数据库优化方面的事情
17.若是查询和定位慢查询
18.数据库优化之数据库表设计遵循范式
19.选择合适的数据库引擎
20.选择合适的索引
21.使用索引的一些技巧
22.数据库优化之分表
23.数据库的读写分离
24.数据库优化之缓存
25.sql语句优化小技巧
26.批量插入几百万条数据mysql
1.mysql事务原理,特性,事务并发控制
事务是数据库并发控制的基本单位
事务能够看做是一系列SQL语句的集合
事务必需要么所有执行成功,要么所有执行失败(回滚)
转帐操做是事务使用最多见的场景redis
ACID是事务的四个基本特性
原子性:一个事务中全部操做所有完成或失败
一致性:事务开始和结束以后数据完整性没有被破坏
隔离性:容许多个事务同时对数据库修改和读写
持久性:事务结束以后,修改是永久的不会丢失算法
事务的并发控制可能产生的问题(四种异常状况)
幻读:一个事务第二次查出现第一次没有的结果
非重复读:一个事务重复读两次获得不一样的结果
脏读:一个事务读取到另外一个事务没有提交的修改
丢失修改:并发写入形成其中一些修改丢失sql
解决以上4种异常,定义了4种事务隔离级别
读未提交:别的事务能够读取到未提交改变
读已提交:只能读取已经提交的数据
可重复读:同一个事务前后查询结果同样(innodb默认实现可重复读级别)
串行化:事务彻底串行化的执行,隔离级别最高,执行效率最低数据库
如何解决高并发场景下的插入重复
高并发场景下,写入数据库会有数据重复问题
使用数据库的惟一索引
使用队列异步写入
使用redis实现分布式锁缓存
乐观锁和悲观锁
悲观锁是先获取锁再进行操做。一锁二查三更新 (select for update)
乐观锁先修改,更新的时候发现数据已经变了就回滚(check and set) 通常经过版本号或时间戳实现
使须要根据响应速度,冲突频率,重试代价来判断使用哪种安全
经常使用字段,含义和区别
字符串 char/varchar/text
数值 tinyint/smallint/bigint/int/float/double length 数据库可见长度
日期和时间 date/datetime/timestamp服务器
经常使用数据库引擎之间区别
innodb/myisam
myisam不支持事务/innodb支持事务
myisam不支持外键/innodb支持外键
myisam只支持表锁/innodb支持行锁和表锁
myisam支持全文索引/innodb不支持全文索引微信
mysql索引
索引的原理、类型、结构
索引是数据表中一个或者多个列进行排序的数据结构
索引可以大幅提高检索速度
建立、更新索引自己也会消耗空间和时间
B-Tree
查找结构进化史
线性查找:一个个找;实现简单;太慢
二分查找:有序;简单;要求是有序的,插入特别慢
HASH:查询快;占用空间;不太适合存储大规模数据
二叉树:插入和查询很快;没法存大规模数据,复杂度退化
平衡树:解决bst退化问题,树是平衡的;节点很是多的时候,依然树高很高
多路查找树:一个父亲多个孩子节点(度/阶);节点过多树高不会特别深
多路平衡查找树:B-Tree(每一个节点最多m(m>=2)个孩子,称为m阶或者度) 阶的大小是根据磁盘块的4k大小来肯定
叶节点具备相同的深度
节点中的数据key从左到右是递增的
B+树
只在叶子节点带有指向记录的指针(能够增长树的度) 根据磁盘块大小来肯定一个节点来存储多个阶
叶子节点经过指针相连。实现范围查询
mysql索引类型
普通索引 (create index)
惟一索引,索引列的值必须惟一(create unique index)
多列索引 B+树的key是由多个列组成的
主键索引(primary key),一个表只能有一个
全文索引(fulltext index),innodb不支持, 倒排索引实现 es
何时建立索引
建表的时候须要根据查询需求来建立索引
常常用做查询条件的字段(where条件)
常常用做表链接的字段
常常出如今order by,group by以后的字段
建立索引有哪些须要注意的 最佳实践
非空字段 not null,mysql很难对空值作查询优化 建表规范要求索引字段有默认值
区分度高,离散度大,做为索引的字段值尽可能不要有大量相同值
索引的长度不要太长(比较耗费时间)
索引何时失效(模糊匹配,类型隐转,最左匹配) 索引失效是由于key无法比较
以%开头的LIKE语句,模糊搜索
出现隐式类型转换(在python这种动态语言查询中须要注意)
没有知足最左前缀原则,无法直接比较
什么是汇集索引和非汇集索引(辅助索引)
区别是B+Tree叶节点存的是指针仍是数据记录
myisam索引和数据分离,使用的是非汇集索引
innodb数据文件是索引文件,主键索引是汇集索引
如何排查和消除慢查询
慢查询一般是缺乏索引,索引不合理或者业务代码实现致使
slow_query_log_file 开启而且查询慢查询日志
经过explain排查索引问题
调整数据修改索引;业务代码层限制不合理访问
SQL语句编写
内连接(inner join) 两个表都存在匹配时,才会返回匹配行
将左表和右表可以关联起来的数据链接后返回
相似于求两个表的"交集"
select * from A inner join B on a.id=b.id;
外链接(left/right join) 返回一个表的行,即便另外一个没有匹配
左链接返回左表中全部记录,即便右表中没有匹配的记录
右链接返回右表中全部记录,即便左表中没有匹配的记录
没有匹配的字段会设置成NULL
select * from A left join B on A.id=B.id;
全链接(full join) 只要某一个表存在匹配就返回
oracle里面有full join,可是在mysql中没有full join。咱们可使用union来达到目的。
select * from t1 left join t2 on t1.id = t2.id union select * from t1 right join t2 on t1.id = t2.id;
MyISAM和InnoDB搜索引擎的特色
存储引擎说白了就是如何存储数据、如何为存储的数据创建索引和如何更新、查询数据等技术的实现方法。因此存储引擎也能够称为表类型。
MyISAM:
特色:
(1)不支持事务:MyISAM存储引擎不支持事务,因此对事务有要求的业务场景不能使用
(2)表级锁定:其锁定机制是表级索引,这虽然可让锁定的实现成本很小可是也同时大大下降了其并发性能
(3)读写互相阻塞:不只会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读自己并不会阻塞另外的读
(4)只会缓存索引:MyISAM能够经过key_buffer缓存以大大提升访问性能减小磁盘IO,可是这个缓存区只会缓存索引,而不会缓存数据
适用场景:
(1)不须要事务支持(不支持)
(2)并发相对较低(锁定机制问题)
(3)数据修改相对较少(阻塞问题)
(4)以读为主
(5)数据一致性要求不是很是高
InnoDB:
特色:
(1)具备较好的事务支持:支持4个事务隔离级别,支持多版本读
(2)行级锁定:经过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响
(3)读写阻塞与事务隔离级别相关
(4)具备很是高效的缓存特性:能缓存索引,也能缓存数据
(5)整个表和主键以Cluster方式存储,组成一颗平衡树
(6)全部Secondary Index都会保存主键信息
适用场景:
(1)须要事务支持(具备较好的事务特性)
(2)行级锁定对高并发有很好的适应能力,但须要确保查询是经过索引完成
(3)数据更新较为频繁的场景
(4)数据一致性要求较高
(5)硬件设备内存较大,能够利用InnoDB较好的缓存能力来提升内存利用率,尽量减小磁盘 IO
char 和varchar字符串类型的区别?
char类型:定长,存入字符长度大于设置长度时报错,存入字符长度小于设置长度时,会用空格填充,达到设置字符长度,简单粗暴,浪费空间,存取速度快。
Varchar类型:varchar类型存储数据的真实内容,不会用空格填充,会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数,变长,精准,节省空间,存取速度慢。
虽然varchar使用起来较为灵活,可是从整个系统的性能角度来讲,char数据类型的处理速度更快,有时甚至能够超出varchar处理速度的50%。所以,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡。
foreign key外键关联(一对多)实例。
create table press(
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
mysql索引相关介绍。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表能够有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。MySQL索引的创建对于MySQL的高效运行是很重要的,索引能够大大提升MySQL的检索速度。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会形成滥用。所以索引也会有它的缺点:虽然索引大大提升了查询速度,同时却会下降更新表的速度,如对表进行INSERT、UPDATE和DELETE。由于更新表时,MySQL不只要保存数据,还要保存一下索引文件。创建索引会占用磁盘空间的索引文件。
联合索引命中规则是:最左匹配规则,以下联合索引(姓名,年龄,性别):
诸如select * from user where name= ‘zzz’ and sex=’male’ and age=18查询语句,当对name、sex、age分别创建列索引和创建(name、sex、age)组合索引时,查询的结果是不同的,组合索引效率高于多个列索引,由于在执行多个列索引的时候,mysql只会选择其中一个效率最高的。可是经过组合索引就直接锁定那一条信息了。因为组合索引的最左匹配原则,上述组合索引至关于分别创建(name),(name、sex),(name、sex、age)这样的三个索引,只有查询条件与这三个顺序相一致的才会用到组合索引。
MySQL在如下操做场景下会使用索引
1) 快速查找符合where条件的记录
2) 快速肯定候选集。若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。
3) 若是表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动做为索引来加速查找。
例如,若为某表建立了3个字段(c1, c2, c3)构成的联合索引,则(c1), (c1, c2), (c1, c2, c3)均会做为索引,(c2, c3)就不会被做为索引,而(c1, c3)其实只利用到c1索引。
4) 多表作join操做时会使用索引(若是参与join的字段在这些表中均创建了索引的话)。
5) 若某字段已创建索引,求该字段的min()或max()时,MySQL会使用索引。
6) 对创建了索引的字段作sort或group操做时,MySQL会使用索引。
mysql中随着数据量的增大,查询速度会愈来愈慢,请给出简易的优化方案。
1.合理的添加索引(mysql默认只会btree类型索引);
mysql常见的索引:
普通索引INDEX:加速查找
惟一索引:
-主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
-惟一索引UNIQUE:加速查找+约束(不能重复)
联合索引:
-PRIMARY KEY(id,name):联合主键索引
-UNIQUE(id,name):联合惟一索引
-INDEX(id,name):联合普通索引
二、避免使用select *
三、建立表时尽可能用char代替varchar
四、表的字段顺序,固定长度的优先
五、组合索引代替多个单列索引
六、使用链接(join)代替子查询
七、使用explain优化神器
关系型数据库中,表与表之间有左链接、内链接、外链接,分别指出他们的含义及区别?
一、 交叉链接:不使用任何匹配条件生成笛卡尔积
select * from employee,department
二、内链接:只链接匹配的行
selcet employee.name,employee.age,department.name from employee inner join department on employee.dep_id = department.id
三、外链接之左链接:优先显示左表所有内容
selcet employee.name,employee.age,department.name from employee left join department on employee.dep_id = department.id
四、外链接之右链接:优先显示右表所有内容
selcet employee.name,employee.age,department.name from employee right join department on employee.dep_id = department.id
五、全外链接:显示左右两个表所有记录(mysql不支持full join),实现方式以下:
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
1.关系型数据库的三范式
范式就是规范,就是关系型数据库在设计表时,要遵循的三个规范。要想知足第二范式必须先知足第一范式,要知足第三范式必须先知足第二范式。
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割
二范式(2NF)要求数据库表中的每一个行必须能够被惟一地区分。为实现区分一般须要为表加上一个列,以存储各个实例的惟一标识。(主键)
知足第三范式(3NF)必须先知足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)
反三范式,有的时候为了效率,能够设置重复或者能够推导出的字段.订单(总价)和订单项(单价)
2.事务的四大特征
事务是并发控制的单位,是用户定义的一个操做序列。这些操做要么都作,要么都不作,是一个不可分割的工做单位。
一个转帐必须 A帐号扣钱成功,B帐号加钱成功,才算正真的转帐成功。
事务必须知足四大特征:原子性,一致性,隔离性持久性/持续性
原子性:表示事务内操做不可分割。要么都成功、要么都是失败.
一致性:要么都成功、要么都是失败.后面的失败了要对前面的操做进行回滚。
隔离性:一个事务开始后,不能后其余事务干扰。
持久性/持续性:表示事务开始了,就不能终止。
3.mysql数据库最大链接数
100
为何须要最大链接数?特定服务器上面的数据库只能支持必定数目同时链接,这时候咱们通常都会设置最大链接数(最多同时服务多少链接)。
在数据库安装时都会有一个默认的最大链接数为100
4.mysql的分页语句
为何须要分页?在不少数据是,不可能彻底显示数据.进行分段显示.Mysql是使用关键字limit来进行分页的 limit offset,size 表示从多少索引去多少位.
5.触发器的使用场景?
触发器,须要有触发条件,当条件知足之后作什么操做。
6.存储过程的优势
一、存储过程只在建立时进行编译,之后每次执行存储过程都不需再从新编译,而通常 SQL 语句每执行一次就编译一次,所以使用存储过程能够大大提升数据库执行速度。
二、一般,复杂的业务逻辑须要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操做不少时,将产生大量的网络传输。若是将这些操做放在一个存储过程当中,那么客户机和服务器之间的网络传输就会大大减小,下降了网络负载。
三、存储过程建立一次即可以重复使用,从而能够减小数据库开发人员的工做量。
四、安全性高,存储过程能够屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。
7.jdbc调用存储过程
加载驱动
获取链接
设置参数
执行
释放链接
8.简单说一下你对jdbc的理解
9.写一个jdbc的访问oracle的列子
10.jdbc中preparedStatement比Statement的好处
11.数据库链接池的做用
一、限定数据库的个数,不会致使因为数据库链接过多致使系统运行缓慢或崩溃
二、数据库链接不须要每次都去建立或销毁,节约了资源
三、数据库链接不须要每次都去建立,响应时间更快。
12.ORM是什么?ORM框架是什么?
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。能够简单的方案是采用硬编码方式(jdbc操做sql方式),为每一种可能的数据库访问操做提供单独的方法。这种方法存在不少缺陷,使用
使用ORM框架(为了解决解决面向对象与关系数据库存在的互不匹配的现象的框架)来解决.
Hibernate,ibatis(mybatis),
13.ibatis和hibernate有什么不一样
14.hibernate对象状态及其转换
15.hibernate的缓存
Hibernate中的缓存分一级缓存和二级缓存。
一级缓存就是Session级别的缓存,在事务范围内有效是,内置的不能被卸载。二级缓存是SesionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,须要手动开启。
保存数据库后,在内存中保存一份,若是更新了数据库就要同步更新。
什么样的数据适合存放到第二级缓存中?
1)不多被修改的数据 帖子的最后回复时间
2)常常被查询的数据 电商的地点
2) 不是很重要的数据,容许出现偶尔并发的数据
3) 不会被并发访问的数据
4) 常量数据
扩展:hibernate的二级缓存默认是不支持分布式缓存的。使用memcahe,redis等中央缓存来代替二级缓存。
16.数据库优化方面的事情
定位:查找、定位慢查询
优化手段:
a)建立索引:建立合适的索引,咱们就能够如今索引中查询,查询到之后直接找对应的记录。
b)分表:当一张表的数据比较多或者一张表的某些字段的值比较多而且不多使用时,采用水平分表和垂直分表来优化
c)读写分离:当一台服务器不能知足需求时,采用读写分离的方式进行集群。
d)缓存:使用redis来进行缓存
17.若是查询和定位慢查询
在项目自验项目转测试以前,在启动mysql数据库时开启慢查询,而且把执行慢的语句写到日志中,在运行必定时间后。经过查看日志找到慢查询语句。
要找出项目中的慢Sql时
一、关闭数据库服务器(关闭服务)
二、把慢查询记录到日志中
三、设置慢查询时间
四、找出日志中的慢查询SQL 使用explain 慢查询语句,来详细分析语句的问题.
18.数据库优化之数据库表设计遵循范式
三范式
19.选择合适的数据库引擎
MyISAM存储引擎
若是表对事务要求不高,同时是以查询和添加为主的,咱们考虑使用myisam存储引擎. 好比 bbs 中的 发帖表,回复表.
INNODB存储引擎:
对事务要求高,保存的数据都是重要数据,咱们建议使用INNODB,好比订单表,帐号表.
Memory 存储
咱们数据变化频繁,不须要入库,同时又频繁的查询和修改,咱们考虑使用memory, 速度极快.
问 MyISAM 和 INNODB的区别(主要)
1. 事务安全 myisam不支持事务而innodb支持
2. 查询和添加速度 myisam不用支持事务就不用考虑同步锁,查找和添加和添加的速度快
3. 支持全文索引 myisam支持innodb不支持
4. 锁机制 myisam支持表锁而innodb支持行锁(事务)
5. 外键 MyISAM 不支持外键, INNODB支持外键. (一般不设置外键,一般是在程序中保证数据的一致)
20.选择合适的索引
索引(Index)是帮助DBMS高效获取数据的数据结构。
分类:普通索引/惟一索引/主键索引/全文索引
普通索引:容许重复的值出现
惟一索引:除了不能有重复的记录外,其它和普通索引同样(用户名、用户身份证、email,tel)
主键索引:是随着设定主键而建立的,也就是把某个列设为主键的时候,数据库就会給改列建立索引。这就是主键索引.惟一且没有null值
全文索引:用来对表中的文本域(char,varchar,text)进行索引, 全文索引针对MyIsam
explain select * from articles where match(title,body) against(‘database’);【会使用全文索引】
21.使用索引的一些技巧
索引弊端
1.占用磁盘空间。
2.对dml(插入、修改、删除)操做有影响,变慢。
使用场景:
a: 确定在where条件常用,若是不作查询就没有意义
b: 该字段的内容不是惟一的几个值(sex)
c: 字段内容不是频繁变化.
具体技巧:
1.对于建立的多列索引(复合索引),不是使用的第一部分就不会使用索引。
alter table dept add index my_ind (dname,loc); // dname 左边的列,loc就是右边的列
explain select * from dept where dname='aaa'\G 会使用到索引
explain select * from dept where loc='aaa'\G 就不会使用到索引
2. 对于使用like的查询,查询若是是’%aaa’不会使用到索引而‘aaa%’会使用到索引。
explain select * from dept where dname like '%aaa'\G不能使用索引
explain select * from dept where dname like 'aaa%'\G使用索引.
因此在like查询时,‘关键字’的最前面不能使用 % 或者 _这样的字符.,若是必定要前面有变化的值,则考虑使用 全文索引->sphinx.
3.若是条件中有or,有条件没有使用索引,即便其中有条件带索引也不会使用。换言之,就是要求使用的全部字段,都必须单独使用时能使用索引.
4.若是列类型是字符串,那必定要在条件中将数据使用引号引用起来。不然不使用索引。
expain select * from dept where dname=’111’;
expain select * from dept where dname=111;(数值自动转字符串)
expain select * from dept where dname=qqq;报错
也就是,若是列是字符串类型,不管是否是字符串数字就必定要用 ‘’ 把它包括起来.
5.若是mysql估计使用全表扫描要比使用索引快,则不使用索引。 表里面只有一条记录
22.数据库优化之分表
分表分为水平(按行)分表和垂直(按列)分表
根据经验,Mysql表数据通常达到百万级别,查询效率会很低,容易形成表锁,甚至堆积不少链接,直接挂掉;水平分表可以很大程度较少这些压力。
按行数据进行分表。
若是一张表中某个字段值很是多(长文本、二进制等),并且只有在不多的状况下会查询。这时候就能够把字段多个单独放到一个表,经过外键关联起来。
考试详情,通常咱们只关注分数,不关注详情。
水平分表策略:
1.按时间分表
这种分表方式有必定的局限性,当数据有较强的实效性,如微博发送记录、微信消息记录等,这种数据不多有用户会查询几个月前的数据,如就能够按月分表。
2.按区间范围分表
通常在有严格的自增id需求上,如按照user_id水平分表:
table_1 user_id从1~100w
table_2 user_id从101~200w
table_3 user_id从201~300w
3.hash分表*****
经过一个原始目标的ID或者名称经过必定的hash算法计算出数据存储表的表名,而后访问相应的表。
23.数据库的读写分离
主从同步
数据库最终会把数据持久化到磁盘,若是集群必须确保每一个数据库服务器的数据是一直的。能改变数据库数据的操做都往主数据库去写,而其余的数据库从主数据库上同步数据。
读写分离
使用负载均衡来实现写的操做都往主数据去,而读的操做往从服务器去。
24.数据库优化之缓存
在持久层(dao)和数据库(db)之间添加一个缓存层,若是用户访问的数据已经缓存起来时,在用户访问时直接从缓存中获取,不用访问数据库。而缓存是在操做内存级,访问速度快。
做用:减小数据库服务器压力,减小访问时间。
25.sql语句优化小技巧
DDL优化:
1 、经过禁用索引来提供导入数据性能 。 这个操做主要针对有数据库的表,追加数据
//去除键
alter table test3 DISABLE keys;
//批量插入数据
insert into test3 select * from test;
//恢复键
alter table test3 ENABLE keys;
二、 关闭惟一校验
set unique_checks=0 关闭
set unique_checks=1 开启
三、修改事务提交方式(导入)(变屡次提交为一次)
set autocommit=0 关闭
//批量插入
set autocommit=1 开启
DML优化(变屡次提交为一次)
insert into test values(1,2);
insert into test values(1,3);
insert into test values(1,4);
//合并多条为一条
insert into test values(1,2),(1,3),(1,4)
DQL优化
Order by优化
一、多用索引排序
二、普通结果排序(非索引排序)Filesort
group by优化
是使用order by null,取消默认排序
子查询优化
在客户列表找到不在支付列表的客户
#在客户列表找到不在“支付列表”的客户 , 查询没买过东西的客户
explain
select * from customer where customer_id not in (select DISTINCT customer_id from payment); #子查询 -- 这种是基于func外链
explain
select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null -- 这种是基于“索引”外链
Or优化
在两个独立索引上使用or的性能优于
一、 or两边都是用索引字段作判断,性能好!!
二、 or两边,有一边不用,性能差
三、 若是employee表的name和email这两列是一个复合索引,可是若是是 :name='A' OR email='B' 这种方式,不会用到索引!
limit优化
select film_id,description from film order by title limit 50,5;
select a.film_id,a.description from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id
26.批量插入几百万条数据一、变屡次提交为一次三、使用批量操做省出的时间可观。像这样的批量插入操做能不使用代码操做就不使用,可使用存储过程来实现。