當前位置:首頁 » 編程語言 » 千萬級別單表sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

千萬級別單表sql

發布時間: 2023-08-31 08:27:32

❶ 千萬條數據用代碼還是sql

千萬條數據是用SQL的。
1.真正做過幾個項 目才會明白,寫sql語句會比編程代碼還要多。真正的程序,其實是sql。 最後說一句,如果經驗足夠豐富,寫出的統計過程,其執行時間在數分鍾甚至幾個小時都是正常的。
2.在SQL語句中實現通常效率更高,因為在java代碼中往往會損耗很大性能。比如一個最簡單的場景A表100W,B表100W,他們連接的結果是1000條數據。那麼在SQL裡面做連接操作的話,資料庫和java程序之間只需要傳遞1000條數據。如果在Java代碼裡面實現資料庫和Java程序之間需要傳遞200W條數據。
3.從這個簡單的場景可以看到,徒增了傳輸的性能損耗。並且占據了更多應用進程的內存和CPU資源,所以大部分場景下建議是在SQL裡面處理比較優。

❷ 怎麼快速復制千萬級的Mysql資料庫表

我google了一下大概有一下幾個方法,
1.復製表結構及數據到新表
CREATE TABLE 新表 SELECT * FROM 舊表
2.只復製表結構到新表
CREATE TABLE 新表 SELECT * FROM 舊表 WHERE 1=2
即:讓WHERE條件不成立.
3.復制舊表的數據到新表(假設兩個表結構一樣)
INSERT INTO 新表 SELECT * FROM 舊表
4.復制舊表的數據到新表(假設兩個表結構不一樣)
INSERT INTO 新表(欄位1,欄位2,.......) SELECT 欄位1,欄位2,...... FROM 舊表

❸ mysql千萬級數據update怎麼優化

提問:何設計或優化千萬級別表外其信息覺題點范簡單說該何做於存儲設計必須考慮業務特點收集信息:
1.數據容量:1-3內概少條數據每條數據概少位元組;
2.數據項:否欄位些欄位值否經更新;
3.數據查詢SQL條件:哪些數據項列名稱經現WHERE、GROUP BY、ORDER BY句等;
4.數據更新類SQL條件:少列經現UPDATE或DELETE WHERE句;
5.SQL量統計比:SELECT:UPDATE+DELETE:INSERT=少
6.預計表及相關聯SQL每總執行量何數量級
7.表數據:更新主業務 查詢主業務
8.打算採用資料庫物理伺服器及資料庫伺服器架構
9.並發何
10.存儲引擎選擇InnoDBMyISAM

致明白10問題至於何設計類表應該都清楚

至於優化若指創建表能變表結構建議InnoDB引擎利用點內存減輕磁碟IO負載IO往往資料庫伺服器瓶頸

另外優化索引結構解決性能問題建議優先考慮修改類SQL語句使更快些已靠索引組織結構式前提 索引已經創建非若讀主考慮打query_cache 及調整些參數值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_siz
更信息參見:
MySQL資料庫伺服器端核參數詳解推薦配置
紙談兵說我思路及我解決拋磚引玉
我近解決問題
我現公司三張表5億數據每張表每增量100w
每張表概10columns左右
面我做測試比
1.首先看engine,數據量情況沒做區情況
mysiam比innodb讀情況效率要高13%左右
2.做partition讀mysql官文檔其實於partition專門myisam做優化於innodb所數據存ibdata面所即使看schema變其實沒本質變化
區於同physical disk面情況提升概1%
區同physical disk我三同disks提升概3%其實所謂吞吐量由素決定比explain parition候看record區每區都其實本質沒解決讀問題提升寫效率
另外問題於區張表三column都經用於做查詢條件其實件悲慘事情沒辦所sql做針性區mysql官文檔說間做區且用間查詢恭喜
3.表主要用讀寫其實問題充應該問寫入候同並發查詢我問題比較簡單mongodb shredding支持能crushmysql所通情況9am-9pm寫入情況候我做 viewview基於近插入或者經查詢通做view離讀取說寫table讀進行邏輯判斷前view操作
4做些archive table比先些表做已統計析通已析+增量解決
5用mysiam問題要注意.configure候加max index length參數候record數於制定度候indexdisable

❹ 如何設計一個能夠高效查詢的千萬級MySQL資料庫

我們先探討非高並發量的實現。

對於查詢頻次較高的欄位,加上索引。

加索引注意事項:1.對那些字元內容較長的最好不要加索引2.按照官方文檔,單表加的索引不要超過16個,索引的長度不要超過256個位元組。隨意加索引,會給數據維護增知臘加負擔

其實,可以引入分區。

分區注意事項:1.常見的分區類型有range,list,hash,key等。用的比較多的就是range分區。2.對於初始建立索引的時候,我們往往會忽視一個前提條件,導致添加失敗報錯。這里的前提是,如果表是有主鍵的,分區的鍵和主鍵不是同一個,那麼分區的鍵也必須是主鍵。

引入分區後,數據寫入時,資料庫會自動判斷寫入哪個分區

對於譽慎並發量較高的,我們除了做上搭虛滑面的操作外,就要考慮分庫分表或者採用一主多從的方式。

未來我相信這類問題需要採用NewSQl這類資料庫來解決,如TiDb等,此時,我們將不必考慮數據分區的問題,而且可以做到數據水平無限擴展,和熱點數據的動態分布。

❺ oracle表連接千萬級數據SQL優化

要看數據多到何種程度。 比如一個表的筆數只是幾百,如果不需要和其他大表關聯查詢數據,連索引都不用建。 如果是幾十萬級別的表,一般正確建索引就可以。 如果是千萬級別的表,不但要正確建索引,而且要定時手工進行收集統計信息維護

❻ mysql 如何更好的給一個千萬級數據量的表增

例子:
數據表 collect ( id, title ,info ,vtype) 就這4個欄位,其中 title 用定長,info 用text, id 是逐漸,vtype是tinyint,vtype是索引。這是一個基本的新聞系統的簡單模型。現在往裡面填充數據,填充10萬篇新聞。
最後collect 為 10萬條記錄,資料庫表佔用硬碟1.6G。OK ,看下面這條sql語句:
select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的
select id,title from collect limit 90000,10; 從9萬條開始分頁,結果?
8-9秒完成,my god 哪出問題了????其實要優化這條數據,網上找得到答案。看下面一條語句:
select id from collect order by id limit 90000,10; 很快,0.04秒就OK。為什麼?因為用了id主鍵做索引當然快。網上的改法是:
select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;
這就是用了id做索引的結果。可是問題復雜那麼一點點,就完了。看下面的語句
select id from collect where vtype=1 order by id limit 90000,10; 很慢,用了8-9秒!
到了這里我相信很多人會和我一樣,有崩潰感覺!vtype 做了索引了啊?怎麼會慢呢?vtype做了索引是不錯,你直接 select id from collect where vtype=1 limit 1000,10; 是很快的,基本上0.05秒,可是提高90倍,從9萬開始,那就是0.05*90=4.5秒的速度了。和測試結果8-9秒到了一個數量級。從這里開始有人提出了分表的思路,這個和discuz 論壇是一樣的思路。思路如下:
建一個索引表: t (id,title,vtype) 並設置成定長,然後做分頁,分頁出結果再到 collect 裡面去找info 。 是否可行呢?實驗下就知道了。
10萬條記錄到 t(id,title,vtype) 里,數據表大小20M左右。用
select id from t where vtype=1 order by id limit 90000,10; 很快了。基本上0.1-0.2秒可以跑完。為什麼會這樣呢?我猜想是因為collect 數據太多,所以分頁要跑很長的路。limit 完全和數據表的大小有關的。其實這樣做還是全表掃描,只是因為數據量小,只有10萬才快。OK,來個瘋狂的實驗,加到100萬條,測試性能。
加了10倍的數據,馬上t表就到了200多M,而且是定長。還是剛才的查詢語句,時間是0.1-0.2秒完成!分表性能沒問題?錯!因為我們的limit還是9萬,所以快。給個大的,90萬開始
select id from t where vtype=1 order by id limit 900000,10; 看看結果,時間是1-2秒!
why 分表了時間還是這么長,非常之郁悶!有人說定長會提高limit的性能,開始我也以為,因為一條記錄的長度是固定的,mysql 應該可以算出90萬的位置才對啊? 可是我們高估了mysql 的智能,他不是商務資料庫,事實證明定長和非定長對limit影響不大?怪不得有人說 discuz到了100萬條記錄就會很慢,我相信這是真的,這個和資料庫設計有關!
難道MySQL 無法突破100萬的限制嗎???到了100萬的分頁就真的到了極限???
答案是: NO !!!! 為什麼突破不了100萬是因為不會設計mysql造成的。下面介紹非分表法,來個瘋狂的測試!一張表搞定100萬記錄,並且10G 資料庫,如何快速分頁!
好了,我們的測試又回到 collect表,開始測試結論是: 30萬數據,用分表法可行,超過30萬他的速度會慢道你無法忍受!當然如果用分表+我這種方法,那是絕對完美的。但是用了我這種方法後,不用分表也可以完美解決!
答案就是:復合索引!有一次設計mysql索引的時候,無意中發現索引名字可以任取,可以選擇幾個欄位進來,這有什麼用呢?開始的select id from collect order by id limit 90000,10; 這么快就是因為走了索引,可是如果加了where 就不走索引了。抱著試試看的想法加了 search(vtype,id) 這樣的索引。然後測試
select id from collect where vtype=1 limit 90000,10; 非常快!0.04秒完成!
再測試: select id ,title from collect where vtype=1 limit 90000,10; 非常遺憾,8-9秒,沒走search索引!
再測試:search(id,vtype),還是select id 這個語句,也非常遺憾,0.5秒。
綜上:如果對於有where 條件,又想走索引用limit的,必須設計一個索引,將where 放第一位,limit用到的主鍵放第2位,而且只能select 主鍵!
完美解決了分頁問題了。可以快速返回id就有希望優化limit , 按這樣的邏輯,百萬級的limit 應該在0.0x秒就可以分完。看來mysql 語句的優化和索引時非常重要的!
好了,回到原題,如何將上面的研究成功快速應用於開發呢?如果用復合查詢,我的輕量級框架就沒的用了。分頁字元串還得自己寫,那多麻煩?這里再看一個例子,思路就出來了:
select * from collect where id in (9000,12,50,7000); 竟然 0秒就可以查完!
mygod ,mysql 的索引竟然對於in語句同樣有效!看來網上說in無法用索引是錯誤的!
有了這個結論,就可以很簡單的應用於輕量級框架了:
代碼如下:
$db=dblink();
$db->pagesize=20;
$sql="select id from collect where vtype=$vtype";
$db->execute($sql);
$strpage=$db->strpage(); //將分頁字元串保存在臨時變數,方便輸出
while($rs=$db->fetch_array()){
$strid.=$rs['id'].',';
}
$strid=substr($strid,0,strlen($strid)-1); //構造出id字元串
$db->pagesize=0; //很關鍵,在不注銷類的情況下,將分頁清空,這樣只需要用一次資料庫連接,不需要再開;
$db->execute("select id,title,url,sTime,gTime,vtype,tag from collect where id in ($strid)");
< php while($rs=$db->fetch_array()): >
<tr>
<td$amp;>amp;$amp;nbsp;< php echo $rs['id']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['url']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['sTime']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['gTime']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['vtype']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;<a act=show&id=< php echo $rs['id']; $amp;>quot;$ target="_blank"$amp;>amp;$lt; php echo $rs['title']; $amp;>amp;$lt;/a$amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['tag']; $amp;>amp;$lt;/td>
</tr>
< php endwhile; >
</table>
< php
echo $strpage;
通過簡單的變換,其實思路很簡單:1)通過優化索引,找出id,並拼成 "123,90000,12000" 這樣的字元串。2)第2次查詢找出結果。
小小的索引+一點點的改動就使mysql 可以支持百萬甚至千萬級的高效分頁!
通過這里的例子,我反思了一點:對於大型系統,PHP千萬不能用框架,尤其是那種連sql語句都看不到的框架!因為開始對於我的輕量級框架都差點崩潰!只適合小型應用的快速開發,對於ERP,OA,大型網站,數據層包括邏輯層的東西都不能用框架。如果程序員失去了對sql語句的把控,那項目的風險將會成幾何級數增加!尤其是用mysql 的時候,mysql 一定需要專業的dba 才可以發揮他的最佳性能。一個索引所造成的性能差別可能是上千倍!
PS: 經過實際測試,到了100萬的數據,160萬數據,15G表,190M索引,就算走索引,limit都得0.49秒。所以分頁最好別讓別人看到10萬條以後的數據,要不然會很慢!就算用索引。經過這樣的優化,mysql到了百萬級分頁是個極限!但有這樣的成績已經很不錯,如果你是用sqlserver肯定卡死!而 160萬的數據用 id in (str) 很快,基本還是0秒。如果這樣,千萬級的數據,mysql應該也很容易應付。

❼ mysql千萬或者上億的數據怎麼設計資料庫

單表一億?還是全庫1億?

1.首先可以考慮業務層面優化,即垂直分表。

垂直分表就是把一個數據量很大的表,可以按某個欄位的屬性或使用頻繁程度分類,拆分為多個表。

如有多種業務類型,每種業務類型入不同的表,table1,table2,table3.

如果日常業務不需要使用所有數據,可以按時間分表,比如說月表。每個表只存一個月記錄。

2.架構上的優化,即水平分表。

水平分表就是根據一列或多列數據的值把數據行放到多個獨立的表裡,這里不具備業務意義。

如按照id分表,末尾是0-9的數據分別插入到10個表裡面。

可能你要問,這樣看起來和剛才說的垂直分表沒什麼區別。只不過是否具備業務意義的差異,都是按欄位的值來分表。

實際上,水平分表現在最流行的實現方式,是通過水平分庫來實現的。即剛才所說的10個表,分布在10個mysql資料庫上。這樣可以通過多個低配置主機整合起來,實現高性能。

最常見的解決方案是cobar,這個帖子介紹的比較完善,可以看看。

http://blog.csdn.net/shagoo/article/details/8191346

cobar的邏輯層次圖:

不過這種分庫方式也是有一定局限性的,需要應用程序做相應的配合,比如說分庫的情況下,雖然可以實現跨庫查詢,但是不能進行相關的group by計算。

另外,之前關於水平分表的實現方式,也可以通過表分區來實現。

mysql優化的方式有很多,選擇上主要還是要考慮個人的實際情況,如代碼不可控的情況下,就不適合選擇按欄位屬性分表的情況,這樣可能會帶來大量的重構以及很多不可預期的風險。

而架構的優化,雖然對應用是透明的,但對sql的寫法有很多局限性,比如說不能使用聚合函數等等,同時也需要有充足的硬體資源,只有一台伺服器的情況下是沒有意義的。

相比起來,代價最低的是按時間分表或分區,這兩種辦法對應用來說都是透明的。

分區只需要一次本地數據遷移的操作。

而通過分表把現網數據和歷史數據分離,唯一的代價是定期的數據維護。

一般如果表裡面有1億數據的情況下,索引的問題應該是常識了,這方面我就不說了。