### Mysql性能優化
儘可能不要寫select * ,若是須要全表數據,使用select 加全部字段列名稱查詢代替*
儘可能減小字段列的數學計算,如:where num * 2 >= 30,可改成 where num >= 30/2
學會使用 explain 關鍵字 查看當前sql語句的優化程度
例如:
explain select * from emp where ename = "孫悟空"
table : 表名
type : 鏈接類型,從最差到最好分爲 all(查詢全部)、range(查詢知足條件的)、 const(只有一條結果)。儘可能不要用all類型的查詢語句
key :索引名,若是該列沒有索引,則爲null
key_len : 索引長度,越短越好
rows : 掃描行數,該值是個預估值
extra : 詳細說明,常見不太友好的值。以下:Using filesort ,Using temporary
一、當只要一行數據時使用 limit 1
表示只要第一頁 第一條 數據,使用場景:
查詢時已知會獲得一條數據,這種狀況下加上 limit 1 能夠提升查詢性能。由於mysql 數據庫引擎會在找到第一條結果中止搜索,而不是繼續查詢下一條是否符合條件直到查詢完全部數據
二、選擇正確的數據庫引擎
MyISAS、InnoDB
MyISAS 適合大量查詢的應用。若是有 update語句,會鎖住整張表,直到結束才能執行其餘查詢操做。
InnoDB 是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,InnoDB 是默認的 MySQL引擎。
三、索引添加
對於常常用來查詢的字段,應該爲它創建索引。提升以該字段爲搜索條件的查詢效率
添加方式:
1.添加PRIMARY KEY(主鍵索引):
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(惟一索引) :
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引) :
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引) :
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引:
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
四、表建立
表關係
一對一
一對多:
一的一方:主表
多的一方:從表
外鍵:須要在從表新建一列做爲外鍵,他的取值來源主表的主鍵
多對多:
中間表:中間表中最少應該由兩個字段組成,這兩個字段做爲外鍵指向兩張表的主鍵,又組成了聯合主鍵。
在相對不嚴謹的項目中通常咱們不建立表之間的關聯(不使用外鍵關聯)。都是使用代碼控制他們邏輯上的關係。
五、數據庫儘量的使用 NOT NULL 填充
由於 select id from t where num is null 這樣的 sql 也是能夠的
Mysql難以優化引用可空列查詢,它會使索引、索引統計和值更加複雜。可空列須要更多的存儲空間,還須要mysql內部進行特殊處理。可空列被索引後,每條記錄都須要一個額外的字節,還能致使MYisam 中固定大小的索引變成可變大小的索引
注意:但把NULL列改成NOT NULL帶來的性能提示很小,除非肯定它帶來了問題,不然不要把它當成優先的優化措施,最重要的是使用的列的類型的適當性
六、13.2 select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10 如何優化? ?
優化爲: select * from (select * from admin where admin_id>10) T1 lef join log on T1.admin_id =log.admin_id。
使用 JOIN 時候,應該 用小的結果驅動大的結果(left join 左邊表結果儘可能小若是有條件應該放到左邊先處理,
right join 同理反向),同時儘可能把牽涉到多表聯合的查詢拆分多個 query(多個連表查詢效率低,容易到以後鎖表和
阻塞)
七、limit 的基數比較大時使用 between
例如:select * from admin order by admin_id limit 100000,10
優化爲:select * from admin where admin_id between 1000000 and 1000010 order by admin_id。
八、儘可能避免在列上作運算,這樣致使索引失效
例如:select * from admin where year(admin_time)>2014
優化爲: select * from admin where admin_time> '2014-01-01′
### Mysql 事務
一、事務的介紹
Transaction
事務只和DML(增刪改)語句有關,或者說DML語句纔有事務。這個和業務邏輯有關,業務邏輯不一樣,DML語句的個數不一樣
在mysql 中事務是自動提交的,由於單條語句執行成功是自動提交的
事務支持。開啓、提交、回滾
二、事務的四大特性
原子性(A):事務是最小單位,不可再分
一致性(C):事務要求全部的DML語句操做的時候,必須保證同時成功或者同時失敗
隔離性(I):事務A和事務B之間具備隔離性
持久性(D):是事務的保證,事務終結的標誌(內存的數據持久到硬盤文件中)
* 事務四大特性之一————隔離性(isolation)
事物A和事物B之間具備必定的隔離性
隔離性有隔離級別(4個)
讀未提交:read uncommitted
讀已提交:read committed
可重複讀:repeatable read
串行化:serializable
一、 read uncommitted 讀未提交
- 事物A和事物B,事物A未提交的數據,事物B能夠讀取到
- 這裏讀取到的數據叫作「髒數據」
- 這種隔離級別最低,這種級別通常是在理論上存在,數據庫隔離級別通常都高於該級別
二、read committed 讀已提交
- 事物A和事物B,事物A提交的數據,事物B才能讀取到
- 這種隔離級別高於讀未提交
- 換句話說,對方事物提交以後的數據,我當前事物才能讀取到
- 這種級別能夠避免「髒數據」
- 這種隔離級別會致使「不可重複讀取」
- Oracle默認隔離級別
三、repeatable read 可重複讀
- 事務A和事務B,事務A提交以後的數據,事務B讀取不到
- 事務B是可重複讀取數據
- 這種隔離級別高於讀已提交
- 換句話說,對方提交以後的數據,我仍是讀取不到
- 這種隔離級別能夠避免「不可重複讀取」,達到可重複讀取
- 好比1點和2點讀到數據是同一個
- MySQL默認級別
- 雖然能夠達到可重複讀取,可是會致使「幻像讀」
四、serializable 串行讀
- 事務A和事務B,事務A在操做數據庫時,事務B只能排隊等待
- 這種隔離級別不多使用,吞吐量過低,用戶體驗差
- 這種級別能夠避免「幻像讀」,每一次讀取的都是數據庫中真實存在數據,事務A與事務B串行,而不併發