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