真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

百萬數(shù)據(jù)php 百萬數(shù)據(jù)排序

如何向數(shù)據(jù)庫快速的寫入百萬條數(shù)據(jù)

如何向數(shù)據(jù)庫快速的寫入百萬條數(shù)據(jù)

成都創(chuàng)新互聯(lián)公司專注于七里河網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供七里河營銷型網(wǎng)站建設(shè),七里河網(wǎng)站制作、七里河網(wǎng)頁設(shè)計、七里河網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造七里河網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供七里河網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

現(xiàn)在我的處理方式是讀取原數(shù)據(jù)庫表的所有數(shù)據(jù),大概有一百萬條吧,然后放到一個數(shù)組里面,循環(huán)向目標(biāo)數(shù)據(jù)庫寫數(shù)據(jù)(兩個數(shù)據(jù)庫之間的數(shù)據(jù)遷移,表結(jié)構(gòu)不同,我是寫的php腳本來查詢導(dǎo)入的),一開始速度還可以,但是現(xiàn)在幾乎一秒鐘一條了

a數(shù)據(jù)庫中有幾百萬條數(shù)據(jù),用php從a數(shù)據(jù)庫中取出數(shù)據(jù)進行處理,速度很慢。

本身從幾百萬數(shù)據(jù)中查1000條就慢,你還用for去循環(huán)這個過程 不慢就怪了

Es實現(xiàn)百萬級數(shù)據(jù)快速檢索

在用戶點擊一篇采購文章,會匹配到該文章全部相關(guān)內(nèi)容。所有數(shù)據(jù)是存在ES中的,百萬量級。恩~要用python寫一個接口。通過查找資料,通過 ES模糊搜索 可以實現(xiàn)。

prefix的匹配一般是處理不分詞的場景,將會匹配articleID中以”J”開頭的doc。prefix不會計算revelance score,只是作一個過濾的操作,和filter唯一的區(qū)別是filter會緩存結(jié)果,而prefix不會。前綴越短要處理的doc越多,性能越差。

?會匹配任意字符,*會匹配0個或多個字符。性能根prefix一樣差,必須要掃描整個倒排索引。

[0-9]:指定范圍內(nèi)的數(shù)字

[a-z]:指定范圍內(nèi)的字幕

.:一個字符

+:前面的正則表達式可以出現(xiàn)一次或多次

正則的搜索同樣會掃描全表,性能也會很差

fuzziness參數(shù)調(diào)整糾正的次數(shù)

通常不會直接用上述搜索,而會用下面的搜索:

在es中,使用組合條件查詢是其作為搜索引擎檢索數(shù)據(jù)的一個強大之處,在前幾篇中,簡單演示了es的查詢語法,但基本的增刪改查功能并不能很好的滿足復(fù)雜的查詢場景,比如說我們期望像mysql那樣做到拼接復(fù)雜的條件進行查詢該如何做呢?es中有一種語法叫bool,通過在bool里面拼接es特定的語法可以做到大部分場景下復(fù)雜條件的拼接查詢,也叫復(fù)合查詢

首先簡單介紹es中常用的組合查詢用到的關(guān)鍵詞,

filter:過濾,不參與打分

must:如果有多個條件,這些條件都必須滿足 and與

should:如果有多個條件,滿足一個或多個即可 or或

must_not:和must相反,必須都不滿足條件才可以匹配到 !非

發(fā)生 描述

must

該條款(查詢)必須出現(xiàn)在匹配的文件,并將有助于得分。

filter

子句(查詢)必須出現(xiàn)在匹配的文檔中。然而不像 must查詢的分?jǐn)?shù)將被忽略。Filter子句在過濾器上下文中執(zhí)行,這意味著評分被忽略,子句被考慮用于高速緩存。

should

子句(查詢)應(yīng)該出現(xiàn)在匹配的文檔中。如果 bool查詢位于查詢上下文中并且具有mustor filter子句,則bool即使沒有should查詢匹配,文檔也將匹配該查詢 。在這種情況下,這些條款僅用于影響分?jǐn)?shù)。如果bool查詢是過濾器上下文 或者兩者都不存在,must或者filter至少有一個should查詢必須與文檔相匹配才能與bool查詢匹配。這種行為可以通過設(shè)置minimum_should_match參數(shù)來顯式控制 。

must_not

子句(查詢)不能出現(xiàn)在匹配的文檔中。子句在過濾器上下文中執(zhí)行,意味著評分被忽略,子句被考慮用于高速緩存。因為計分被忽略,0所有文件的分?jǐn)?shù)被返回。

下面用實驗演示一下上述查詢的相關(guān)語法,

1、首先,我們創(chuàng)建一個索引,并且在索引里添加幾條數(shù)據(jù),方便后面使用,

我這里直接批量插入數(shù)據(jù),也可以通過PUT的語法單條執(zhí)行插入,

POST /forum/article/_bulk

{ "index": { "_id": 1 }}

{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2019-07-01","title":"java contains hadoop and spark","topic":"java" }

{ "index": { "_id": 2 }}

{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2019-07-02",title":"php contains admin","topic":"java and php" }

{ "index": { "_id": 3 }}

{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2019-07-03" ,title":"spark is new language","topic":"spark may use java"}

{ "index": { "_id": 4 }}

{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2019-07-04" ,title":"hadoop may involve java","topic":"big data used"}

或者使用put語法

PUT /forum/article/4

{

"articleID": "QQPX-R-3956-#aD8",

"userID": 2,

"hidden": true,

"postDate": "2019-07-04",

"title": "hadoop may involve java",

"topic": "big data used"

}

4條數(shù)據(jù)插入成功,

2、termQuery,term查詢不分詞,類似于mysql的where filedName = ? 語法,即精準(zhǔn)匹配,比如我們查詢articleID = XHDK-A-1293-#fJ3的這條數(shù)據(jù),

GET /forum/article/_search

{

"query": {

"term": {

"articleID.keyword":"XHDK-A-1293-#fJ3"

}

}

}

2、must查詢,即查詢的條件中必須匹配的字段,例如,查詢title中必須包含java的數(shù)據(jù),

GET /forum/article/_search

{

"query": {

"bool": {

"must": [

{"term":{"title":"hadoop"}}

]

}

}

}

查出兩條數(shù)據(jù)

如果是should呢?如下語法,即查詢title中包含hadoop或者topic中包含spark,二者滿足其一即可,

GET /forum/article/_search

{

"query": {

"bool": {

"should": [

{"term":{"title":"hadoop"}},

{"term": {"topic": "spark"}}

]

}

}

}

查詢出3條數(shù)據(jù),

must和should結(jié)合使用,

最后再來一個比較復(fù)雜的嵌套查詢,我們先看一下這條sql語句,

select *

from forum.article

where article_id=‘XHDK-A-1293-#fJ3’

or (article_id=‘JODL-X-1937-#pV7’ and post_date=‘2017-01-01’),

對應(yīng)著轉(zhuǎn)化為es的復(fù)合查詢語法是怎樣的呢?拆分來看,就是一個should語句的嵌套,

GET /forum/article/_search

{

"query": {

"bool": {

"should": [

{

"term": {

"articleID.keyword": "XHDK-A-1293-#fJ3"

}

},

{

"bool": {

"must": [

{

"term": {

"articleID.keyword":"JODL-X-1937-#pV7"

}

},

{

"term": {

"postDate":"2019-07-01"

}

}

]

}

}

}

}

查詢到一條結(jié)果,按照這種思路,如果我們對一個復(fù)雜的查詢不知道如何構(gòu)建查詢語句時,可以考慮先按照sql的語法進行拆分,然后再組織es查詢語句是個不錯的突破口,

到這里,可能我們會有疑問,復(fù)合條件中的term查詢和單純的match區(qū)別在哪里呢?既然都是查詢,究竟原理有何不同呢?

我們知道m(xù)atch query是需要全文檢索的,是進行full text的全文檢索,當(dāng)然如果搜索的字段值做了not_analyzed,match query也相當(dāng)于是term query了,比如下面這個搜索,由于在插入數(shù)據(jù)的時候我們沒有對title這個字段進行規(guī)定,默認(rèn)就是text類型的,會被自動分詞,這樣查詢的時候只要title中包含了 hadoop,就可以匹配到,

GET /forum/article/_search

{

"query": {

"match": {

"title": "hadoop"

}

}

}

2、有些情況下,假如我們直接使用match進行查詢,又希望查出來的結(jié)果盡可能是我們期望的包含更多關(guān)鍵詞的結(jié)果,則在match進行匹配的時候可以添加其他的條件,以便提升結(jié)果的匹配精確度,

GET /forum/article/_search

{

"query": {

"match": {

"title": {

"query": "java hadoop",

"operator": "and"

}

}

}

}

這樣匹配出來的結(jié)果包含了更多我們期望的關(guān)鍵詞,即query中可以指定我們查詢的結(jié)果中包含的關(guān)鍵詞,

es還有其他的語法達到上述的效果,minimum_should_match ,通過這個語法,可以指定匹配的百分?jǐn)?shù),就是查詢的關(guān)鍵詞至少要達到的百分?jǐn)?shù),下面這個表示全部匹配,只查詢到一條結(jié)果,

假如我們將百分?jǐn)?shù)調(diào)低點,比如75%,可以看到查到兩條結(jié)果,

3、當(dāng)然,我們也可以將bool和match結(jié)合起來使用,如下,

GET /forum/article/_search

{

"query": {

"bool": {

"must": [

{"match": {"title": "java"}}

],

"must_not": [

{ "match": { "title": "spark"}}

]

, "should": [

{

"match": {

"title": "php"

}

}

]

}

}

}

通過這種方式,也可以達到更精準(zhǔn)的匹配我們期望的查詢結(jié)果,

簡單總結(jié)來說,當(dāng)我們使用match進行查詢的時候,如果查詢的field包含多個詞,比如像下面這個,

{

"match": { "title": "java elasticsearch"}

}

其實es會在底層自動將這個match query轉(zhuǎn)換為bool的語法bool should,指定多個搜索詞,同時使用term query,則轉(zhuǎn)化后的語法如下,

{

"bool": {

"should": [

{ "term": { "title": "java" }},

{ "term": { "title": "elasticsearch" }}

]

}

}

而上面所說的match中加and的查詢,對應(yīng)于bool查詢,轉(zhuǎn)化后為 term+must 的語法如下,

{

"match": {

"title": {

"query": "java elasticsearch",

"operator": "and"

}

}

}

{

"bool": {

"must": [

{ "term": { "title": "java" }},

{ "term": { "title": "elasticsearch" }}

]

}

}

對于minimum_should_match這種語法來說,道理類似,

{

"match": {

"title": {

"query": "java elasticsearch hadoop spark",

"minimum_should_match": "75%"

}

}

}

{

"bool": {

"should": [

{ "term": { "title": "java" }},

{ "term": { "title": "elasticsearch" }},

{ "term": { "title": "hadoop" }},

{ "term": { "title": "spark" }}

],

"minimum_should_match": 3

}

}

我們來看一個具體的操作實例,也就是說必須至少包含3個關(guān)鍵詞的數(shù)據(jù)才會出現(xiàn)在搜索結(jié)果中,

3、在搜索中,我們有這樣一種需求,期望搜索的結(jié)果中包含java 如果標(biāo)題中包含hadoop或spark就優(yōu)先搜索出來,同時呢,如果一個帖子包含java hadoop,一個帖子包含java spark,包含hadoop的帖子要比spark優(yōu)先搜索出來,

對于這樣的需求,通俗來講,就是需要通過增大某些搜索條件的權(quán)重,從而在搜索的結(jié)果中,更多符合和滿足我們業(yè)務(wù)場景的數(shù)據(jù)靠前搜索出來,在es中可以通過boost關(guān)鍵詞來增加搜索條件的權(quán)重,

GET /forum/article/_search

{

"query": {

"bool": {

"must": [

{

"match": {

"title": "java"

}

}

],

"should": [

{

"match": {

"title": {

"query": "hadoop"

}

}

},

{

"match": {

"title": {

"query": "spark",

"boost":2

}

}

},

{

"match": {

"title": {

"query": "php"

}

}

},

{

"match": {

"title": {

"query": "hadoop",

"boost": 5

}

}

}

]

}

}

}

上面這個例子意思是我們賦予搜索的title中包含hadoop的條件權(quán)重更大,hadoop的結(jié)果會有限被搜索出來

4、dis_max語法,也叫best_field,在某些情況下,假如我們在bool查詢中用多個字段進行查詢,但是查詢一樣,就可能導(dǎo)致說查詢出來的結(jié)果并不是按照我們期望的那個字段將其排在前面,也就是說,我們只需要包含指定字段的內(nèi)容展示在前面,如下,

GET /forum/article/_search

{

"query": {

"bool": {

"should": [

{ "match": { "title": "java solution" }},

{ "match": { "content": "java solution" }}

]

}

}

}

title和content的搜索條件相同,但我們希望的是結(jié)果中title 包含java solution的靠前展示,但直接這樣查詢可能達不到預(yù)期的效果,如果使用dis_max進行拼接就可以了,

GET /forum/article/_search

{

"query": {

"dis_max": {

"queries": [

{ "match": { "title": "java solution" }},

{ "match": { "content": "java solution" }}

]

}

}

}

通過這樣的方式,使得查詢的結(jié)果更符合預(yù)期值,

5、但是使用dis_max,只取某一個query最大的分?jǐn)?shù),完全不考慮其他query的分?jǐn)?shù),即假如說某個結(jié)果中包title含了java,但topic中沒有包含java,另一卻是相反,還有的結(jié)果是兩者都包含java,在dis_max語法下,只會拿到相關(guān)度得分最高的那一個,而不會考慮其他的結(jié)果,這時,如果需要獲取其他的title或者topic包含java的結(jié)果,可以使用tie_breaker進一步包裝,如下,

GET /forum/article/_search

{

"query": {

"dis_max": {

"queries": [

{ "match": { "title": "spark" }},

{ "match": { "topic": "java"}}

],

"tie_breaker": 0.6

}

}

}

這樣查到3條結(jié)果,綜合來說,最終還是需要結(jié)合實際業(yè)務(wù)場景進行使用,但是在大多數(shù)情況相愛,我們還是希望搜索的結(jié)果中是按照我們給定的條件包含更多的關(guān)鍵詞的內(nèi)容被優(yōu)先搜索出來,

php寫個循環(huán)往mysql數(shù)據(jù)庫插入100w條數(shù)據(jù),每次插入幾萬條就自動停止了。

有兩種情況, 一是 php可運行的最大時間是不是有設(shè)置. 雖然你加了set_time_limit(0). 但很有可能沒設(shè)置成功,因為php有安全模式, 你可以修改php.ini

2是系統(tǒng)資源不夠, 可能是php宕了或者 數(shù)據(jù)庫宕了.

Python/PHP MySQL語句解析器解決業(yè)務(wù)分表

自己曾經(jīng)做過一個網(wǎng)盤項目。剛開始由于需要快速地從0到1建設(shè)上線,所以沒有對核心文檔表進行分表。當(dāng)然我的架構(gòu)理念也是“按需架構(gòu)設(shè)計”。產(chǎn)品需求在沒有明確的長遠計劃的情況下以“小步快跑,趕超競品”為主。后期由于產(chǎn)品功能觸達目標(biāo)用戶群需求點、產(chǎn)品用戶體驗不斷提升、產(chǎn)品多方位導(dǎo)流、加強產(chǎn)品推廣文檔表每天有百萬數(shù)據(jù)增長量。不得不對文檔表進行按用戶id分表。當(dāng)時產(chǎn)品功能已全覆蓋文檔的生命周期。產(chǎn)品功能已豐富多彩。修改所有關(guān)聯(lián)文檔表的業(yè)務(wù)代碼為按用戶id分表開發(fā)測試成本非常高。上線后線上問題不可控。經(jīng)過考慮在業(yè)務(wù)代碼最底層DB層進行SQL語句解析來進行用戶id分表處理。這樣的話開發(fā)測試成本都非常低。上線后有問題方便回滾和追查原因。

今天為大家介紹Python/PHP兩種MySQL語句解析器。當(dāng)時網(wǎng)盤項目用的是PHP編程語言開發(fā)。

Python的SQL語句解析器 。個人推薦使用moz_sql_parser庫。經(jīng)調(diào)研官方的sqlparse庫解析出來的語句段無法滿足需求也很難理解。

1、Python moz_sql_parser庫安裝

2、Python moz_sql_parser SQL語句解析

3、Python moz_sql_parser總結(jié)

PHP的SQL語句解析器。 個人推薦使用PhpMyAdmin的sql-parser組件。PhpMyAdmin是經(jīng)過 歷史 檢驗可信賴的。

1、PHP PhpMyAdmin/sql-parser安裝

2、PHP PhpMyAdmin/sql-parser SQL語句解析

3、PHP PhpMyAdmin/sql-parser總結(jié)

大家有什么問題可以發(fā)評論溝通。

php+mysql優(yōu)化,百萬至千萬級快速分頁mysql性能到底能有多高

php+Mysql 優(yōu)化,百萬至千萬級快速分頁

MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現(xiàn)在充滿信心!MySql 這個數(shù)據(jù)庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統(tǒng)怎么寫都可以,用xx框架可以實現(xiàn)快速開發(fā)。可是數(shù)據(jù)量到了10萬,百萬至千萬,他的性能還能那么高嗎?一點小小的失誤,可能造成整個系統(tǒng)的改寫,甚至更本系統(tǒng)無法正常運行!好了,不那么多廢話了。用事實說話,看例子:

數(shù)據(jù)表 collect ( id, title ,info ,vtype) 就這4個字段,其中 title 用定長,info 用text, id 是逐漸,vtype是tinyint,vtype是索引。這是一個基本的新聞系統(tǒng)的簡單模型?,F(xiàn)在往里面填充數(shù)據(jù),填充10萬篇新聞。

最后collect 為 10萬條記錄,數(shù)據(jù)庫表占用硬盤1.6G。OK ,看下面這條sql語句:

select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的

select id,title from collect limit 90000,10; 從9萬條開始分頁,結(jié)果?

8-9秒完成,my god 哪出問題了????其實要優(yōu)化這條數(shù)據(jù),網(wǎng)上找得到答案。看下面一條語句:

select id from collect order by id limit 90000,10; 很快,0.04秒就OK。為什么?因為用了id主鍵做索引當(dāng)然快。網(wǎng)上的改法是:

select id,title from collect where id=(select id from collect order by id limit 90000,1) limit 10;

這就是用了id做索引的結(jié)果??墒菃栴}復(fù)雜那么一點點,就完了。看下面的語句

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秒的速度了。和測試結(jié)果8-9秒到了一個數(shù)量級。從這里開始有人提出了分表的思路,這個和discuz 論壇是一樣的思路。思路如下:

建一個索引表: t (id,title,vtype) 并設(shè)置成定長,然后做分頁,分頁出結(jié)果再到 collect 里面去找info 。 是否可行呢?實驗下就知道了。

10萬條記錄到 t(id,title,vtype) 里,數(shù)據(jù)表大小20M左右。用

select id from t where vtype=1 order by id limit 90000,10; 很快了?;旧?.1-0.2秒可以跑完。為什么會這樣呢?我猜想是因為collect 數(shù)據(jù)太多,所以分頁要跑很長的路。limit 完全和數(shù)據(jù)表的大小有關(guān)的。其實這樣做還是全表掃描,只是因為數(shù)據(jù)量小,只有10萬才快。OK,來個瘋狂的實驗,加到100萬條,測試性能。

加了10倍的數(shù)據(jù),馬上t表就到了200多M,而且是定長。還是剛才的查詢語句,時間是0.1-0.2秒完成!分表性能沒問題?錯!因為我們的limit還是9萬,所以快。給個大的,90萬開始

select id from t where vtype=1 order by id limit 900000,10; 看看結(jié)果,時間是1-2秒!

why   分表了時間還是這么長,非常之郁悶!有人說定長會提高limit的性能,開始我也以為,因為一條記錄的長度是固定的,mysql 應(yīng)該可以算出90萬的位置才對??? 可是我們高估了mysql 的智能,他不是商務(wù)數(shù)據(jù)庫,事實證明定長和非定長對limit影響不大?怪不得有人說 discuz到了100萬條記錄就會很慢,我相信這是真的,這個和數(shù)據(jù)庫設(shè)計有關(guān)!

難道MySQL 無法突破100萬的限制嗎???到了100萬的分頁就真的到了極限???

答案是: NO !!!! 為什么突破不了100萬是因為不會設(shè)計mysql造成的。下面介紹非分表法,來個瘋狂的測試!一張表搞定100萬記錄,并且10G 數(shù)據(jù)庫,如何快速分頁!

好了,我們的測試又回到 collect表,開始測試結(jié)論是: 30萬數(shù)據(jù),用分表法可行,超過30萬他的速度會慢道你無法忍受!當(dāng)然如果用分表+我這種方法,那是絕對完美的。但是用了我這種方法后,不用分表也可以完美解決!

答案就是:復(fù)合索引!有一次設(shè)計mysql索引的時候,無意中發(fā)現(xiàn)索引名字可以任取,可以選擇幾個字段進來,這有什么用呢?開始的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的,必須設(shè)計一個索引,將where 放第一位,limit用到的主鍵放第2位,而且只能select 主鍵!

完美解決了分頁問題了??梢钥焖俜祷豬d就有希望優(yōu)化limit , 按這樣的邏輯,百萬級的limit 應(yīng)該在0.0x秒就可以分完??磥韒ysql 語句的優(yōu)化和索引時非常重要的!

好了,回到原題,如何將上面的研究成功快速應(yīng)用于開發(fā)呢?如果用復(fù)合查詢,我的輕量級框架就沒的用了。分頁字符串還得自己寫,那多麻煩?這里再看一個例子,思路就出來了:

select * from collect where id in (9000,12,50,7000); 竟然 0秒就可以查完!

mygod ,mysql 的索引竟然對于in語句同樣有效!看來網(wǎng)上說in無法用索引是錯誤的!

有了這個結(jié)論,就可以很簡單的應(yīng)用于輕量級框架了:

代碼如下:

$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); //構(gòu)造出id字符串

$db-pagesize=0; //很關(guān)鍵,在不注銷類的情況下,將分頁清空,這樣只需要用一次數(shù)據(jù)庫連接,不需要再開;

$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=showid= 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)通過優(yōu)化索引,找出id,并拼成 "123,90000,12000" 這樣的字符串。2)第2次查詢找出結(jié)果。

小小的索引+一點點的改動就使mysql 可以支持百萬甚至千萬級的高效分頁!

通過這里的例子,我反思了一點:對于大型系統(tǒng),PHP千萬不能用框架,尤其是那種連sql語句都看不到的框架!因為開始對于我的輕量級框架都差點崩潰!只適合小型應(yīng)用的快速開發(fā),對于ERP,OA,大型網(wǎng)站,數(shù)據(jù)層包括邏輯層的東西都不能用框架。如果程序員失去了對sql語句的把控,那項目的風(fēng)險將會成幾何級數(shù)增加!尤其是用mysql 的時候,mysql 一定需要專業(yè)的dba 才可以發(fā)揮他的最佳性能。一個索引所造成的性能差別可能是上千倍!

PS: 經(jīng)過實際測試,到了100萬的數(shù)據(jù),160萬數(shù)據(jù),15G表,190M索引,就算走索引,limit都得0.49秒。所以分頁最好別讓別人看到10萬條以后的數(shù)據(jù),要不然會很慢!就算用索引。經(jīng)過這樣的優(yōu)化,mysql到了百萬級分頁是個極限!但有這樣的成績已經(jīng)很不錯,如果你是用sqlserver肯定卡死!而 160萬的數(shù)據(jù)用 id in (str) 很快,基本還是0秒。如果這樣,千萬級的數(shù)據(jù),mysql應(yīng)該也很容易應(yīng)付。


分享題目:百萬數(shù)據(jù)php 百萬數(shù)據(jù)排序
鏈接地址:http://weahome.cn/article/hhchph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部