表連接與子查詢的區別


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. )  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM