MYSQL(分表)千萬級資料量的優化方法積累
3、常用SQL語句優化:
- 資料庫(表)設計合理
我們的表設計要符合3NF 3正規化(規範的模式) , 有時我們需要適當的逆正規化
- sql語句的優化(索引,常用小技巧.)
- 資料的配置(快取設大)
- 適當硬體配置和作業系統 (讀寫分離.)
資料的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資料庫支援把慢查詢語句,記錄到日誌中,程式設計師分析. (但是注意,預設情況下不啟動.)
步驟:
- 要這樣啟動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 (列...)
刪除索引
- drop index 索引名 on 表名
- alter table 表名 drop index index_name;
- 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區別是什麼
- MyISAM 不支援外來鍵, Innodb支援
- MyISAM 不支援事務,不支援外來鍵.
- 對資料資訊的儲存處理方式不同.(如果儲存引擎是MyISAM的,則建立一張表,對於三個檔案..,如果是Innodb則只有一張檔案 *.frm,資料存放到ibdata1)
對於 MyISAM 資料庫,需要定時清理
optimize table 表名
l 常見的sql優化手法
- 使用order by null 禁用排序
比如 select * from dept group by ename order by null
- 在精度要求高的應用中,建議使用定點數(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分表場景分析與簡單分表操作 為什麽要分表 首先要知道什麽情況下,才需要分表個人覺得單表記錄條數達到百萬到千萬級別時就要使用分表了,分表的目的就在於此,減小數據庫的負擔,縮短查