表连接与子查询的区别
1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的。
2.在where子句中指定连接条件
3.SQL中优化中有一条:
将子查询转换为连接查询。
原因:子查询会多次运算查询,连接查询利于优化器优化,而且可以使用多线程查询各个连接子句。
4.四、 子查询
在某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询
为了给主查询提供数据而首先执行的查询被叫做子查询
用于子查询的关键字主要包括in、not in、=、<>等
4.1 查询工资比ALLEN搞的员工
- SELECT *
- FROM emp
- WHERE sal>(
- 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同一个部门的员工
- SELECT *
- FROM emp
- WHERE deptno=(
- SELECT deptno FROM emp WHERE ename='ALLEN'
- )
4.3 查询月薪最高的员工的名字
- SELECT ename,sal
- FROM emp
- WHERE sal=(
- SELECT MAX(sal)
- FROM emp
- )