1. 程式人生 > >MYSQL(分表)千萬級資料量的優化方法積累

MYSQL(分表)千萬級資料量的優化方法積累

1、分庫分表 一個主表(例如使用者表)無限制的增長勢必嚴重影響效能,分庫與分表是一個很不錯的解決途徑,也就是效能優化途徑,現在的案例是我們有一個1000多萬條記錄的使用者表members,查詢起來非常之慢,同事的做法是將其雜湊到100個表中,分別從members0到members99,然後根據mid分發記錄到這些表中,牛逼的程式碼大概是這樣子: <?php for($i=0;$i< 100; $i++ ){      //echo "CREATE TABLE db2.members{$i} LIKE db1.members<br>";      echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid0={$i}<br>"; } ?> 2、不停機修改mysql表結構
同樣還是members表,前期設計的表結構不盡合理,隨著資料庫不斷執行,其冗餘資料也是增長巨大,使用了下面的方法來處理: 先建立一個臨時表: CREATE TABLE members_tmp LIKE members 然後修改members_tmp的表結構為新結構,接著使用上面那個for迴圈來匯出資料,因為1000萬的資料一次性匯出是不對的,mid是主鍵,一個區間一個區間的導,基本是一次匯出5萬條吧,這裡略去了 接著重新命名將新表替換上去: RENAME TABLE members TO members_bak,members_tmp TO members; 就是這樣,基本可以做到無損失,無需停機更新表結構,但實際上RENAME期間表是被鎖死的,所以選擇線上少的時候操作是一個技巧。經過這個操作,使得原先8G多的表,一下子變成了2G多 另外還講到了mysql中float欄位型別的時候出現的詭異現象,就是在pma中看到的數字根本不能作為條件來查詢


3、常用SQL語句優化:

  1.       資料庫(表)設計合理

我們的表設計要符合3NF   3正規化(規範的模式) , 有時我們需要適當的逆正規化

  1.       sql語句的優化(索引,常用小技巧.)
  2.       資料的配置(快取設大)
  3.       適當硬體配置和作業系統 (讀寫分離.)

資料的3NF

1NF :就是具有原子性,不可分割.(只要使用的是關係性資料庫,就自動符合)

2NF: 在滿足1NF 的基礎上,我們考慮是否滿足2NF: 只要表的記錄滿足唯一性,也是說,你的同一張表,不可能出現完全相同的記錄, 一般說我們在 表中設計一個主鍵即可.

3NF: 在滿足2NF 的基礎上,我們考慮是否滿足3NF:即我們的欄位資訊可以通過關聯的關係,派生即可.(通常我們通過外來鍵來處理)

逆正規化: 為什麼需呀逆正規化:

(相簿的功能對應資料庫的設計)

適當的逆正規化.

sql語句的優化

sql語句有幾類

ddl (資料定義語言) [create alter drop]

dml(資料操作語言)[insert delete upate ]

select

dtl(資料事務語句) [commit rollback savepoint]

dcl(資料控制語句) [grant  revoke]

show status命令

該命令可以顯示你的mysql資料庫的當前狀態.我們主要關心的是 “com”開頭的指令

show status like ‘Com%’  <=> show session  status like ‘Com%’  //顯示當前控制檯的情況

show global  status like ‘Com%’ ; //顯示資料庫從啟動到 查詢的次數

顯示連線資料庫次數

show status like  'Connections';

這裡我們優化的重點是在 慢查詢. (在預設情況下是10 ) mysql5.5.19

顯示檢視慢查詢的情況

show variables like ‘long_query_time’

為了教學,我們搞一個海量表(mysql儲存過程)

目的,就是看看怎樣處理,在海量表中,查詢的速度很快!

select * from emp where empno=123456;

需求:如何在一個專案中,找到慢查詢的select , mysql資料庫支援把慢查詢語句,記錄到日誌中,程式設計師分析. (但是注意,預設情況下不啟動.)

步驟:

  1.       要這樣啟動mysql

進入到 mysql安裝目錄

2.  啟動 xx>bin\mysqld.exe –slow-query-log   這點注意

測試 ,比如我們把

select * from emp where empno=34678 ;

用了1.5秒,我現在優化.

快速體驗: 在emp表的 empno建立索引.

alter table emp add primary key(empno);

//刪除主鍵索引

alter table emp drop primary key

然後,再查速度變快.

l         索引的原理

介紹一款非常重要工具explain, 這個分析工具可以對 sql語句進行分析,可以預測你的sql執行的效率.

他的基本用法是:

explain sql語句\G

//根據返回的資訊,我們可知,該sql語句是否使用索引,從多少記錄中取出,可以看到排序的方式.

l         在什麼列上新增索引比較合適

①     在經常查詢的列上加索引.

②     列的資料,內容就只有少數幾個值,不太適合加索引.

③     內容頻繁變化,不合適加索引

l         索引的種類

①     主鍵索引 (把某列設為主鍵,則就是主鍵索引)

②     唯一索引(unique) (即該列具有唯一性,同時又是索引)

③     index (普通索引)

④     全文索引(FULLTEXT)

select * from article where content like ‘%李連杰%’;

hello, i am a boy

l       你好,我是一個男孩  =>中文 sphinx

⑤     複合索引(多列和在一起)

create index myind on 表名 (列1,列2);

l         如何建立索引

如果建立unique / 普通/fulltext 索引

1. create [unique|FULLTEXT] index 索引名 on 表名 (列名...)

2. alter table 表名 add index 索引名 (列名...)

//如果要新增主鍵索引

alter table 表名 add primary key (列...)

刪除索引

  1.       drop index 索引名 on 表名
  2.       alter table 表名 drop index index_name;
  3.       alter table 表名 drop primary key

顯示索引

       show index(es) from 表名

       show keys from 表名

       desc 表名

如何查詢某表的索引

show indexes from 表名

l         使用索引的注意事項

查詢要使用索引最重要的條件是查詢條件中需要使用索引。

下列幾種情況下有可能使用到索引:
1,對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。
2,對於使用like的查詢,查詢如果是  ‘�a’ 不會使用到索引 aaa%’ 會使用到索引。

下列的表將不使用索引:
1,如果條件中有or,即使其中有條件帶索引也不會使用。
2,對於多列索引,不是使用的第一部分,則不會使用索引。
3,like查詢是以%開頭
4,如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。
5,如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

l         如何檢測你的索引是否有效

結論: Handler_read_key 越大越少

Handler_read_rnd_next 越小越好

fdisk

find

l         MyISAM 和 Innodb區別是什麼

  1. MyISAM 不支援外來鍵, Innodb支援
  2. MyISAM 不支援事務,不支援外來鍵.
  3. 對資料資訊的儲存處理方式不同.(如果儲存引擎是MyISAM的,則建立一張表,對於三個檔案..,如果是Innodb則只有一張檔案 *.frm,資料存放到ibdata1)

對於 MyISAM 資料庫,需要定時清理

optimize table 表名

l         常見的sql優化手法

  1.       使用order by null  禁用排序

比如 select * from dept group by ename order by null

  1.       在精度要求高的應用中,建議使用定點數(decimal)來儲存數值,以保證結果的準確性

3.  如果欄位是字元型別的索引,用作條件查詢時一定要加單引號,不然索引無效。

4.  主鍵索引如果沒用到,再查詢for update這種情況,會造成表鎖定。容易造成卡死。

1000000.32 萬

create table sal(t1 float(10,2));

create table sal2(t1 decimal(10,2));

問?在php中 ,int 如果是一個有符號數,最大值. int- 4*8=32   2 31 -1

l         表的水平劃分

l         垂直分割表

如果你的資料庫的儲存引擎是MyISAM的,則當建立一個表,後三個檔案. *.frm 記錄表結構. *.myd 資料  *.myi 這個是索引.

mysql5.5.19的版本,他的資料庫檔案,預設放在 (看 my.ini檔案中的配置.)

l         讀寫分離

相關推薦

MYSQL()千萬料量優化方法積累

1、分庫分表 一個主表(例如使用者表)無限制的增長勢必嚴重影響效能,分庫與分表是一個很不錯的解決途徑,也就是效能優化途徑,現在的案例是我們有一個1000多萬條記錄的使用者表members,查詢起來非常之慢,同事的做法是將其雜湊到100個表中,分別從members0到me

mysql千萬料量根據索引優化查詢速度

(一)索引的作用 索引通俗來講就相當於書的目錄,當我們根據條件查詢的時候,沒有索引,便需要全表掃描,資料量少還可以,一旦資料量超過百萬甚至千萬,一條查詢sql執行往往需要幾十秒甚至更多,5秒以上就已經讓人難以忍受了。 提升查詢速度的方向一是提升硬體(記憶體、cpu、硬碟)

mysql千萬料量根據(索引)優化查詢速度

轉自:http://blog.csdn.net/qq_33556185/article/details/52192551 (一)索引的作用 索引通俗來講就相當於書的目錄,當我們根據條件查詢的時候,沒有索引,便需要全表掃描,資料量少還可以,一旦資料量超過百萬甚至千萬,一條查詢

MYSQL千萬料量優化方法積累

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描 如:select id f

深度解析mysql優化手段,輕鬆解決千萬料量操作

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]建表時,usernname長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高INSERT的更新速度

Mysql 千萬料量插入和查詢應該怎麼優化

關於插入: 巨集觀上:建二個表,其中一個表不建主鍵,不鍵索引。只記錄,到了晚上,在把這個表的記錄匯入 有主鍵有索引的表裡。方法的目的,二表,一表為插入最優化,另一表為查詢最優化。 微觀上:以下是涉及到插入表格的查詢的5種改進方法: 一、使用LOAD DATA INFIL

MySQL 千萬 料量根據(索引)優化 查詢 速度

一、索引的作用 索引通俗來講就相當於書的目錄,當我們根據條件查詢的時候,沒有索引,便需要全表掃描,資料量少還可以,一旦資料量超

MySql 頁SQL 大料量limit替代和優化(試驗)

select SQL_NO_CACHE u.id, u.user_id, u.user_name, u.user_name_index, u.email, u.pwd, u.email_token, u.email_active_date, u.

MYSQL頁limit速度太慢優化方法

在mysql中limit可以實現快速分頁,但是如果資料到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的伺服器哦。當一個表資料有幾百萬的資料的時候成了問題!如 * from table limit 0,10 這個沒有問題 當 limit 2000

MySQL上億料量實現刪除重複記錄

上週從資料採集部門拿到一批400份的json檔案,每個檔案裡30w+的json物件,物件裡有uid,對重複的uid,需要去重下. 電腦配置4核8G  廢話不多說,直接上乾貨. 1.建立表datatest5 CREATE TABLE `datatest5` (  

MYSQL一次千萬查詢優化(一)

概述: 交代一下背景,這算是一次專案經驗吧,屬於公司一個已上線平臺的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的SQL查詢變得越來越慢,使用者體驗特別差,因此SQL優化任務交到了我手上。 這個SQL查詢關聯兩個資料表,一個是攻擊IP使用者表主

百萬料量sql優化

  sql分頁優化: 1.SELECT * FROM mt_data_subtitle_site_task_download where id > #{id} limit 10; 2.SELECT * FROM mt_data_subtitle_site_task_d

財務平臺億料量毫秒查詢優化之elasticsearch原理解析

財務平臺進行分錄分表以後,隨著資料量的日漸遞增,業務人員對賬務資料的實時分析響應時間越來越長,體驗性慢慢下降,之前我們基於mysql的效能優化做了一遍,可以說基於mysql該做的優化已經基本上都做了,本次是基於elasticsearch對其做進一步的效能優化

Mysql面試題及千萬資料查詢優化

今天在說Mysql查詢優化之前,我先說一個常見的面試題,並帶著問題深入探討研究。這樣會讓大家有更深入的理解。 一,Mysql資料庫中一個表裡有一千多萬條資料,怎麼快速的查出第900萬條後的100條資料? 怎麼查,誰能告訴我答案?有沒有人想著,不就一條語句搞定嘛 select * from table limi

mysql區詳解

sql char 根據 blank 服務端 lpad one urn 聯系 為什麽要分表和分區? 日常開發中我們經常會遇到大表的情況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致數據庫在查詢和插入的時候耗時太長,性能低下,如果涉及聯合查詢的情況,性

mysql的三種方法

word 完整 似的 我不 syntax ngs 會有 檢索 數量 先說一下為什麽要分表當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小數據庫的負擔,縮短查詢時間。根據個人經驗,mysql執行一個sq

用Merge存儲引擎中間件實現MySQL

title show targe 插入 結束 方法 value 快捷方式 begin 覺得一個用Merge存儲引擎中間件來實現MySQL分表的方法不錯。 可以看下這個博客寫的很清楚--> http://www.cnblogs.com/xbq8080/p/6628034

mysql的3種方法

message crc pos 表鎖定 turn 聊天 isam class style 一,先說一下為什麽要分表 分表的目的就在於此,減小數據庫的負擔,縮短查詢時間。 mysql中有一種機制是表鎖定和行鎖定,為什麽要出現這種機制,是為了保證數據的完整性。 很顯

mysql分庫 ,讀寫分離

淘寶 優化 其他 post water 高並發 表數據 nbsp 解析 1.分表 當項目上線後,數據將會幾何級的增長,當數據很多的時候,讀取性能將會下降,更新表數據的時候也需要更新索引,所以我們需要分表,當數據量再大的時候就需要分庫了。 a.水平拆分:數據分成多個表 b

mysql--

nis copy href .cn 語句 union 應該 轉載 varchar mysql分表場景分析與簡單分表操作 為什麽要分表 首先要知道什麽情況下,才需要分表個人覺得單表記錄條數達到百萬到千萬級別時就要使用分表了,分表的目的就在於此,減小數據庫的負擔,縮短查