1. 程式人生 > >Mysql日常開發注意要點

Mysql日常開發注意要點

Mysql日常開發注意要點

1、MySQL儲存引擎介紹

MyISAM:低版本MySQL預設的MySQL外掛式儲存引擎,儲存檔案易損壞,不支援事務。
InnoDB:目前預設的MySQL儲存引擎,用於事務處理應用程式,具有眾多特性,包括ACID事務支援

建表語句建議使用 ENGINE=InnoDB 欄位,例如:

CREATE TABLE `t_user` (
    ....
) ENGINE=InnoDB AUTO_INCREMENT=初始值 DEFAULT CHARSET=utf8;

2、explain執行計劃mysql explain用法
type: all 全表掃描
rows: 掃描的行數
Extra: Using temporary; Using filesort

3、欄位使用函式,將無法使用索引
例:SELECT * FROM t WHERE YEAR(d) >= 2016;
由於MySQL不像Oracle那樣支援函式索引,即使d欄位有索引,也會直接全表掃描。
應改為-->SELECT * FROM t WHERE d >= '2016-01-01';

建議改為如下,reffereeTime欄位建索引
reffereeTime >= '2016-07-03' AND reffereeTime < '2016-07-10'
reffereeTime >= '2016-07-03 00:00:00' AND reffereeTime < '2016-07-10 00:00:00'

4、以%開頭的like無法使用到索引
SELECT * FROM t WHERE name LIKE '%de%'; #無法使用到索引
SELECT * FROM t WHERE name LIKE 'de%'; #使用到索引

5、避免隱式轉換
列型別是字串,那麼一定記得在where條件中把字串常量值用引號引起來,否則即便這個列上有索引,MySQL也不會用到

6、讓 group by 不排序
group by payment_date order by null 不排序,如統計count(*)

7、隨機數的寫法
SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
MySQL不支援函式索引,會導致全表掃描
應改為SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;

8、子查詢 關聯查詢比較
子查詢效率不如關聯查詢(join)連線,相關子查詢:DEPENDENT SUBQUERY

9、select *
Select與from語句之間只定義返回的欄位名,除非返回所有的欄位,儘量不要使用*,欄位名應按照表的欄位物理順序編寫

10、索引
經常用於WHERE子句中使用的列考慮作索引的列。
經常用於SQL語句中連結表的列考慮作為索引的列。
頻繁修改的列不建議作為索引列。

11、複合索引
使用者在一張表的三個列(a,b,c)建立一複合索引,該複合索引的順序為abc。

在SQL語句的WHERE條件中使用a,ab,abc等都可利用到索引,但是如果使用bc,c等就無法利用到索引。

複合索引 idx1(a, b, c),那麼下面的SQL都可以完整用到索引:
SELECT ... WHERE b = ? AND c = ? AND a = ?; --注意到,WHERE中欄位順序並沒有和索引欄位順序一致
SELECT ... WHERE b = ? AND a = ? AND c = ?;
SELECT ... WHERE a = ? AND b IN (?, ?) AND c = ?;
SELECT ... WHERE a = ? AND b = ? ORDER BY c;
SELECT ... WHERE a = ? AND b IN (?, ?) ORDER BY c;
SELECT ... WHERE a = ? ORDER BY b, c;
SELECT ... ORDER BY a, b, c; -- 可利用聯合索引完成排序

而下面幾個SQL則只能用到部分索引,或者可利用到ICP特性:
SELECT ... WHERE b = ? AND a = ?; -- 只能用到 (a, b) 部分
SELECT ... WHERE a IN (?, ?) AND b = ?; -- EXPLAIN顯示只用到 (a, b)部分索引,同時有ICP
SELECT ... WHERE (a BETWEEN ? AND ?) AND b = ?; -- EXPLAIN顯示只用到 (a, b) 部分索引,同時有ICP
SELECT ... WHERE a = ? AND b IN (?, ?); -- EXPLAIN顯示只用到 (a, b) 部分索引,同時有ICP
SELECT ... WHERE a = ? AND (b BETWEEN ? AND ?) AND c = ?; -- EXPLAIN顯示用到 (a, b, c) 整個索引,同時有ICP
SELECT ... WHERE a = ? AND c = ?; -- EXPLAIN顯示只用到 (a) 部分索引,同時有ICP
SELECT ... WHERE a = ? AND c >= ?; -- EXPLAIN顯示只用到 (a) 部分索引,同時有ICP

ICP(index condition pushdown)是MySQL 5.6的新特性,其機制會讓索引的其他部分也參與過濾,減少引擎層和server層之間的資料傳輸和回表請求,通常情況下可大幅提升查詢效率。

下面的幾個SQL完全用不到該索引:
SELECT ... WHERE b = ?;
SELECT ... WHERE b = ? AND c = ?;
SELECT ... WHERE b = ? AND c = ?;
SELECT ... ORDER BY b;
SELECT ... ORDER BY b, a;

轉載:https://www.cnblogs.com/linjiqin/p/5714567.html