首页 > 数据库技术 > 详细

数据库

时间:2020-01-03 20:59:52      阅读:87      评论:0      收藏:0      [点我收藏+]

1. 左连接,右连接,内连接,外连接的区别 

内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

外连接分为三种:左外连接,右外连接,全外连接。

其中左外连接:left join是以左表的记录为基础的,例如A可以看成左表,B可以看成右表,它的结果集是A表中的数据,再加上A表和B表匹配的数据。其中A表的记录将会全部表示出来,而右表B只会显示符合搜索条件的记录。B表记录不足的地方均为NULL。

右外连接与左外连接正好相反。全连接则是左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充

 

2. MySQL中in 和exsit区别 

exists()后面的子查询被称做相关子查询  ,他是不返回列表的值的.只是返回一个ture或false的结果(所以一般exists中的子查询里写成"select   1 "   当然也可以select任何东西) 
其运行方式是先运行主查询一次 ,再去子查询里查询与其对应的结果,

如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

 in()后面的子查询   是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.

 

3. 数据库中用什么关键字进行排序,升降序,分组,分组后查询

Order by排序,order by 列 desc|asc降升序,group by分组,having分组后查询

 

4. 数据库查询缓慢的常见原因以及优化方法?

(1)没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

(2)I/O吞吐量小,形成了瓶颈效应。

(3)没有创建计算列导致查询不优化。

(4)内存不足,网络速度慢

(5)查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

(6)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

(7)返回了不必要的行和列

(8)查询语句不好,没有优化。

可以通过如下方法来优化查询 :(1)把数据、日志、索引放到不同的I/O设备上,增加读取速度

(2)纵向、横向分割表,减少表的尺寸

(3)升级硬件

(4)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。

(5)DB Server 和APPLication Server 分离

(6)优化SQL语句:

1、SELECT子句中避免使用 ‘ * ‘: 

2、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(ROLLBACK SEGMENTS ) 用来存放可以被恢复的信息. 假如你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (注意: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) 

3、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少

4、用Where子句替换HAVING子句

5、使用表的别名(Alias):  当在SQL语句中连接多个表时, 使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

6、用EXISTS替代IN、用NOT EXISTS替代NOT IN:  在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 。

7、用EXISTS替换DISTINCT: 

8、SQL语句用大写的  因为Orale总是先解析SQL语句,把小写的字母转换成大写的再执行

9、避免在索引列上使用NOT:

10、用>=替代> 

11、用IN来替换OR 

12、避免在索引列上使用IS NULL和IS NOT NULL  13、总是使用索引的第一个列等

 

5.索引查询失效的几个情况

1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。

2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

3、组合索引,不是使用第一列索引,索引失效。

4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。

5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。

6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。

7、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))

8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。

数据库

原文:https://www.cnblogs.com/wf-zhang/p/12146602.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!