1. 程式人生 > >mysql千萬級數據優化查詢

mysql千萬級數據優化查詢

arch nbsp 限定 方法 騰訊 tab 建立 垂直拆分 程序

我們在做一個項目,一個網站或一個app時,用戶量巨增,當使用的mysql數據庫中的表數據達到千萬級時,可以從以下方面考濾優化:

  1、在設計數據庫表的時候就要考慮到優化

  2、查詢sql語句上的優化

  3、從數據庫設計上進行結大框架的設計:如分區、分表、分庫

1、在設計數據庫表的時候就要考慮到優化

  1、盡可能使用not null定義字段,避免null值字段出現,null值會占用額外的索引空間

  2、使用固定長度的字段類型如char而不是varchar

  3、添加索引,在查詢頻繁的字段上加索引,如在where,group by, order by,on中出現的字段加索引

  4、字符字段只建立前綴索引,字符字段最好不要做主鍵

2、查詢sql語句上的優化

  1、不要使用select * 查詢,將要查找的字段寫出來

  2、使用join來代替子查詢

  3、使用limit 對查詢結果的記錄進行限定,千萬級別的數據太多,後面的數據沒必要查出來

  4、OR改寫成IN:因為OR的效率是n級別,IN的效率是log(n)級別

  5、少使用觸發器和函數,可在應用程序代碼實現

  6、也盡量少用join

  7、盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描

  8、列表數據不要拿全表的數據,要使用limit 來分頁

  來說說MySql的引擎:

    目前廣泛使用的是MyISAM和InnoDB兩種引擎:

      MyISAM引擎,MySQL5.1之前版本默認引擎,它的特點是:不支持行鎖,不支持事務,不支持外鍵

      InnoDB引擎,MySQL5.5後默認引擎,它的特點:支持行鎖,采用MVCC來支持高並發,支持事務,支持外鍵,不支持全文索引

  

  分區:

      分區我不太明白,沒怎麽看懂

  分表:

    分表就是把一張超多數據的表,分成多張表,把一次查詢,分成多次查詢,然後把結果組合返回給用戶。

    分表:又有兩種方式,分為垂直拆分和水平拆分,通常以某個字段做拆分項,比如以id字段拆分為100張表:表名為tableName_id%100

    分表只適合開發初期做好分表處理,不適合應用上線後再做修改,成本太高。

  分庫:

    分庫:就是把一個數據庫分成多個,然後做讀寫分離。

  有錢的話,使用其他方法,阿裏雲數據庫POLARDB,阿裏雲OcenanBase (淘寶使用,扛得住雙十一),阿裏雲HybridDB for MySQL (原PetaData) ,騰訊雲數據庫:騰訊雲DCDB等等

另一種情況:數據量過億

  數據量過億只能使用傳說中的大數據了。(做了這麽多年開發,從來沒接觸過這玩意,可能都沒進什麽大公司的原因吧)

  hadoop家族,(具體怎麽玩的暫時還不知道)

。。。

mysql千萬級數據優化查詢