mysql千萬級數據優化查詢
我們在做一個項目,一個網站或一個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千萬級數據優化查詢