生活随笔
收集整理的這篇文章主要介紹了
高性能Mysql(第三版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. Mysql架構和歷史
- 2. 服務器性能剖析
- 3. Schema與數據類型優化
- 1. 整型比字符串類型代價更小。因為字符串需要字符集和校對規則。
- 2. 時間類型:
- 3. 整型類型:
- 4. 索引
- 2. 最左前綴:
- 3. 覆蓋索引:Select 的列,是索引中定制的列。
- 4. 索引的作用
- 5. 前綴索引
- 6. 合并索引
- 7. 聚簇索引
- 8. 覆蓋索引
- 9. 使用索引掃描來做排序
- 10. 壓縮(前綴壓縮)索引
- 11. 冗余和重復索引
- 12. 索引和鎖
- 13. 優化排序
- 5. 查詢優化
1. Mysql架構和歷史
MyISAM只是將數據寫到內存中,等待操作系統定期將數據刷出到磁盤上。所以,無法保證斷電,數據不丟失。infobright用于Mysql數據量過大的時候,作為數據倉庫。修改表的引擎,會丟失表原引擎所有的特性。Mysqldump進行數據導入的時候,需要注意mysqlDump默認會在create table語句之間加載drop table,不注意這點,會導致數據庫中原表的數據丟失。Mysql5.5開始InnoDB才成為了Mysql的默認引擎。
2. 服務器性能剖析
性能分析工具: NewRelic。xhprof。 Mysql 5.0之后,慢查詢日志可以顯示毫秒級別。
3. Schema與數據類型優化
1. 整型比字符串類型代價更小。因為字符串需要字符集和校對規則。
2. 時間類型:
DateTime:存儲時間和日期,精確到秒。 <1001年 - 9999年>TimeSamp:存儲時間和日期,精確到秒。只是DateTime一半的存儲空間,并且會隨著時區變化,具有特殊的自動更新能力。而且允許的時間范圍更小一些。<1970年1月1日 - 2038年>
3. 整型類型:
數據范圍:-2^(n-1) ~ 2^(n-1) - 1, N為空間位數。 且可以選擇unsigned屬性,表示不能為負數,正數的上限提高一倍。 對于指定整數長度是無用的,并不能限制存儲的數值范圍,只是控制了一些數據庫的交互工具顯示的數據位數。在存儲和計算上,Int(1) 和 Int(20)是一致的。 tinyInt: 8位空間。smallInt:16位。MediumInt: 24位。Int: 32位。BigInt: 64位。 實數類型:對于較小的數據使用decimal存儲,對于數據量較大的時候,可以考慮使用bigInt代替Decimal,后面的小數乘以相應的倍數即可。字符串類型:對于varchar可以變長的存儲數據,不會清除數據末尾的空字符串;char則是固定長度,會自動清除數據末尾的空字符串。 MYISAM默認對字符串進行壓縮索引,這會導致查詢慢得多,導致性能大幅度下降。
4. 索引
較好的索引使用文章
Where條件列使用了索引時:先在索引上按值進行查找,然后返回包含該值的所在行。主鍵索引和非主鍵索引是有區別的,主鍵索引存放的值是整行字段的數據,而非主鍵索引上存放的值不是整行字段的數據,而且存放主鍵字段的值。
2. 最左前綴:
當使用復合索引的時候,只有按照索引鍵順序使用,才能使用到索引。跳過最左鍵則無法使用到索引。
3. 覆蓋索引:Select 的列,是索引中定制的列。
4. 索引的作用
讓服務器快速定位到表指定的位置。減少了服務器需要掃描的數據量。避免排序和臨時表的產生。將隨機I/O轉換為順序I/O。
5. 前綴索引
定義: 對于Blob和Text,或是很長的varchar類型的列,若是使用普通索引,因為數據量很大,會導致索引空間劇烈增長,所以,為了減小索引空間,因此,索引前綴就好。而且對于mysql對于這三種類型,不允許索引這些列的全部長度。計算最合適的前綴長度:COUNT(DISTINCT LEFT(name, 1)) / count(*) AS pre1。修改長度。實現:Alter TABLE user ADD KEY (name(8)); 8:是對于name這列設置的索引前綴長度。
6. 合并索引
在mysql5.0之前,是無法把多個索引同時使用,只能使用讓單個索引起效。而mysql 5.0之后,則當創建的索引存在問題,mysql會進行索引優化,把可以用到的索引,合并成一個索引使用。
7. 聚簇索引
定義: 不是索引類型,而是一種數據存儲方式。在InnoDB中的聚簇索引實際上在同一個結構保存了一個B-Tree索引和數據行。索引節點對應的數據實際存放在索引的葉子頁上。 因為無法同時把數據行存放在兩個不同的地方,一個表中只能存在一個聚簇索引。InnoDB通過主鍵聚集數據。optimize table: 你刪除數據時,mysql并不會回收,被已刪除數據的占據的存儲空間,以及索引位。而是空在那里,而是等待新的數據來彌補這個空缺,這樣就有一個缺少,如果一時半會,沒有數據來填補這個空缺,那這樣就太浪費資源了。所以對于寫比較頻煩的表,要定期進行optimize,一個月一次,看實際情況而定了。
8. 覆蓋索引
定義:select中字段,都在索引中存在,便不需要再回表查詢數據。將大大提高性能。
9. 使用索引掃描來做排序
mysql生成有序的結果,只能通過排序操作和按索引順序掃描。若是explain之后的type為index,則說明使用了索引順序掃描的方法排序。mysql可以使用同一個索引既滿足排序,又滿足查找行數據。實現: 只有當索引的列順序和ORDER BY子句的順序完全一致,并且所有的排序方向(倒序或正序)都一樣時,mysql才會使用索引來對結果做排序。若是查詢需要關聯多張表,則只有當ORDER BY子句引用的字段全部為第一個表時,才能使用索引進行排序。ORDER BY也得滿足索引的最左前綴。若是索引的第一個列是常數,則ORDER BY可以不需要滿足最左前綴。eg: where name = ‘Alex’ order by age。 index(name, age)。 但是,若是拍序列的順序方向和索引順序不一致也無法使用到索引。
10. 壓縮(前綴壓縮)索引
定義:通過壓縮前綴,減小索引的存儲空間,讓更多的索引可以放入內存中。默認只能壓縮字符串,整數需要通過參數設置。計算方法:先完全保存索引塊中的第一個值,然后將其他值和第一個值進行比較得到相同的前綴的字節數和剩余不同的后綴部分,把這部分呢存儲起來即可。eg: 1. perform 2. performance, 存儲的時候,存儲的數據:7,ance。
11. 冗余和重復索引
定義:重復索引指的是在相同的列上按照相同的順序創建相同類型的索引。
12. 索引和鎖
在mysql5.1之后,InnoDB可以在服務端過濾掉行后就釋放鎖,但是在mysql早期版本中,只有當事務提交之后,才會釋放鎖。
13. 優化排序
Distinct:執行之后會產生一個中間表,會降低性能,出現Using temporary。Using fileSort: 因為排序的數據過大,在文件中進行排序了,增加索引,排序字段在索引中。
5. 查詢優化
using(Field): field必須是兩個表中一樣的名稱,才能使用。相當于ON的功能。
select t1.id, t1.name
from test t1
inner join test2 using (id)
等同于
inner join test2 t2 ON t2.id = t1.id
連表查詢的時候,關聯表拿出來的字段最好放在索引中,可是使用索引數據,不需要返回到數據行獲取數據。延遲關聯:獲取需要訪問的記錄后再根據關聯列返回原表查詢需要的所有列。這個技術可以用于優化關聯查詢中的limit子句。
問題:查詢多少頁的多少條數據
1.常規查詢
SELECT id,name,age
FROM `user`
LIMIT 50, 52.延遲關聯
SELECT id, name, age
FRO `user`
INNER JOIN ( // 先查詢出需要的id,因為id是主鍵存在索引,可以直接從索引中,獲取到需要的id。SELECT id // 再使用inner join,根據id,查詢需要的其余列。FROM `user`LIMIT 50, 5
) as user1 USING(id)
總結
以上是生活随笔為你收集整理的高性能Mysql(第三版)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。