Mysql平常開發注意要點

一、MySQL存儲引擎介紹html

MyISAM:低版本MySQL默認的MySQL插件式存儲引擎,存儲文件易損壞,不支持事務。
InnoDB:目前默認的MySQL存儲引擎,用於事務處理應用程序,具備衆多特性,包括ACID事務支持mysql

建表語句建議使用 ENGINE=InnoDB 字段,例如:sql

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

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

三、字段使用函數,將沒法使用索引
例:SELECT * FROM t WHERE YEAR(d) >= 2016;
因爲MySQL不像Oracle那樣支持函數索引,即便d字段有索引,也會直接全表掃描。
應改成-->SELECT * FROM t WHERE d >= '2016-01-01';spa

建議改成以下,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'插件

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

五、避免隱式轉換
列類型是字符串,那麼必定記得在where條件中把字符串常量值用引號引發來,不然即使這個列上有索引,MySQL也不會用到server

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

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

八、子查詢 關聯查詢比較
子查詢效率不如關聯查詢(join)鏈接,相關子查詢:DEPENDENT SUBQUERY

九、select *
Select與from語句之間只定義返回的字段名,除非返回全部的字段,儘可能不要使用*,字段名應按照表的字段物理順序編寫

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

十一、複合索引
用戶在一張表的三個列(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;

相關文章
相關標籤/搜索