表连接与子查询的区别

1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的。

2.在where子句中指定连接条件

3.SQL中优化中有一条:

将子查询转换为连接查询。

原因:子查询会多次运算查询,连接查询利于优化器优化,而且可以使用多线程查询各个连接子句。

4.四、 子查询
    在某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询
    为了给主查询提供数据而首先执行的查询被叫做子查询
    用于子查询的关键字主要包括in、not in、=、<>等

 

4.1 查询工资比ALLEN搞的员工

 
  1. SELECT *  
  2. FROM emp  
  3. WHERE sal>(  
  4. SELECT sal FROM emp WHERE ename='ALLEN'  

5.sql语句里,如果使用了mysql的函数,索引就无效了?是的

 

 上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而 开启缓存。

6.EXPLAIN 你的 SELECT 查询

使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。

3. 当只要一行数据时使用 LIMIT 1

当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。

在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。

下面的示例,只是为了找一下是否有“中国”的用户,很明显,后面的会比前面的更有效率。(请注意,第一条中是Select *,第二条是Select 1)

10.

MySQL何时使用索引

   对一个键码使用>, >=, =, <, <=, IF NULL和BETWEEN
  
  SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5;
  
  SELECT * FROM table_name WHERE key_part1 IS NULL;
  当使用不以通配符开始的LIKE
  
  SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'
  在进行联结时从另一个表中提取行时
  
  SELECT * from t1,t2 where t1.col=t2.key_part
  找出指定索引的MAX()或MIN()值
  
  SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
  一个键码的前缀使用ORDER BY或GROUP BY
  
  SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3
  在所有用在查询中的列是键码的一部分时间
  
  SELECT key_part3 FROM table_name WHERE key_part1=1

 

11.

如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = …),MySQL也将无法使用索引。

 



4.2 查询和ALLEN同一个部门的员工

  1. SELECT *  
  2. FROM emp  
  3. WHERE deptno=(  
  4. SELECT deptno FROM emp WHERE ename='ALLEN'  
  5. )  


4.3 查询月薪最高的员工的名字

    1. SELECT ename,sal  
    2. FROM emp  
    3. WHERE sal=(  
    4. SELECT MAX(sal)  
    5. FROM emp  
    6. )  
posted @ 2016-09-19 19:57  跨境电商杂货铺  阅读(4397)  评论(0编辑  收藏  举报