人妻系列无码专区av在线,国内精品久久久久久婷婷,久草视频在线播放,精品国产线拍大陆久久尤物

當(dāng)前位置:首頁 > 前端設(shè)計(jì) > 正文

mysql的in數(shù)量太多?mysql 大量in解決

mysql的in數(shù)量太多?mysql 大量in解決

老鐵們,大家好,相信還有很多朋友對于mysql的in數(shù)量太多和mysql 大量in解決的相關(guān)問題不太懂,沒關(guān)系,今天就由我來為大家分享分享mysql的in數(shù)量太多以及m...

老鐵們,大家好,相信還有很多朋友對于mysql的in數(shù)量太多和mysql 大量in解決的相關(guān)問題不太懂,沒關(guān)系,今天就由我來為大家分享分享mysql的in數(shù)量太多以及mysql 大量in解決的問題,文章篇幅可能偏長,希望可以幫助到大家,下面一起來看看吧!

mysql的中文全文搜索,關(guān)于分詞,有沒有好的解決方案

全文檢索在MySQL里面很早就支持了,只不過一直以來只支持英文。緣由是他從來都使用空格來作為分詞的分隔符,而對于中文來講,顯然用空格就不合適,需要針對中文語義進(jìn)行分詞。

這不,從MySQL5.7開始,MySQL內(nèi)置了ngram全文檢索插件,用來支持中文分詞,并且對MyISAM和InnoDB引擎有效。

在使用中文檢索分詞插件ngram之前,先得在MySQL配置文件里面設(shè)置他的分詞大小,比如,[mysqld]ngram_token_size=2這里把分詞大小設(shè)置為2。要記住,分詞的SIZE越大,索引的體積就越大,所以要根據(jù)自身情況來設(shè)置合適的大小。示例表結(jié)構(gòu):

CREATETABLEarticles(idINTUNSIGNEDAUTO_INCREMENTNOTNULLPRIMARYKEY,titleVARCHAR(200),bodyTEXT,FULLTEXT(title,body)WITHPARSERngram)ENGINE=InnoDBCHARACTERSETutf8mb4;示例數(shù)據(jù),有6行記錄。mysql>select*fromarticles\G**************************

*1.row***************************id:1title:數(shù)據(jù)庫管理body:在本教程中我將向你展示如何管理數(shù)據(jù)庫***************************2.row***************************id:2title:數(shù)據(jù)庫應(yīng)用開發(fā)body:學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序***************************3.row***************************id:3title:MySQL完全手冊body:學(xué)習(xí)MySQL的一切***************************4.row***************************id:4title:數(shù)據(jù)庫與事務(wù)處理body:系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論***************************5.row***************************id:5title:NoSQL精髓body:學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫***************************6.row***************************id:6title:SQL語言詳解body:詳細(xì)了解如果使用各種SQL6rowsinset(0.00sec)顯式指定全文檢索表源mysql>SETGLOBALinnodb_ft_aux_table="new_feature/articles";QueryOK,0rowsaffected(0.00sec)通過系統(tǒng)表,就可以查看到底是怎么劃分articles里的數(shù)據(jù)。

mysql>SELECT*FROMinformation_schema.INNODB_FT_INDEX_CACHELIMIT20,10;+------+--------------+-------------+-----------+--------+----------+|WORD|FIRST_DOC_ID|LAST_DOC_ID|DOC_COUNT|DOC_ID|POSITION|+------+--------------+-------------+-----------+--------+----------+|中我|2|2|1|2|28||習(xí)m|4|4|1|4|21||習(xí)了|6|6|1|6|16||習(xí)開|3|3|1|3|25||習(xí)數(shù)|5|5|1|5|37||了解|6|7|2|6|19||了解|6|7|2|7|23||事務(wù)|5|5|1|5|12||事務(wù)|5|5|1|5|40||何管|2|2|1|2|52|+------+--------------+-------------+-----------+--------+----------+10rowsinset(0.00sec)這里可以看到,把分詞長度設(shè)置為2,所有的數(shù)據(jù)都只有兩個(gè)一組。上面數(shù)據(jù)還包含了行的位置,ID等等信息。

接下來,我來進(jìn)行一系列檢索示范,使用方法和原來英文檢索一致。1.自然語言模式下檢索:A,得到符合條件的個(gè)數(shù),mysql>SELECTCOUNT(*)FROMarticles->WHEREMATCH(title,body)AGAINST('數(shù)據(jù)庫'INNATURALLANGUAGEMODE);+----------+|COUNT(*)|+----------+|4|+----------+1rowinset(0.05sec)B,得到匹配的比率,mysql>SELECTid,MATCH(title,body)AGAINST('數(shù)據(jù)庫'INNATURALLANGUAGEMODE)ASscoreFROMarticles;+----+----------------------+|id|score|+----+----------------------+|1|0.12403252720832825||2|0.12403252720832825||3|0||4|0.12403252720832825||5|0.062016263604164124||6|0|+----+----------------------+6rowsinset(0.00sec)2.布爾模式下搜索,這個(gè)就相對于自然模式搜索來的復(fù)雜些:A,匹配既有管理又有數(shù)據(jù)庫的記錄,mysql>SELECT*FROMarticlesWHEREMATCH(title,body)->AGAINST('+數(shù)據(jù)庫+管理'INBOOLEANMODE);+----+------------+--------------------------------------+|id|title|body|+----+------------+--------------------------------------+|1|數(shù)據(jù)庫管理|在本教程中我將向你展示如何管理數(shù)據(jù)庫|+----+------------+--------------------------------------+1rowinset(0.00sec)B,匹配有數(shù)據(jù)庫,但是沒有管理的記錄,mysql>SELECT*FROMarticlesWHEREMATCH(title,body)->AGAINST('+數(shù)據(jù)庫-管理'INBOOLEANMODE);+----+------------------+----------------------------+|id|title|body|+----+------------------+----------------------------+|2|數(shù)據(jù)庫應(yīng)用開發(fā)|學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序||4|數(shù)據(jù)庫與事務(wù)處理|系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論||5|NoSQL精髓|學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫|+----+------------------+----------------------------+3rowsinset(0.00sec)C,匹配MySQL,但是把數(shù)據(jù)庫的相關(guān)性降低,mysql>SELECT*FROMarticlesWHEREMATCH(title,body)->AGAINST('>數(shù)據(jù)庫+MySQL'INBOOLEANMODE);+----+---------------+-----------------+|id|title|body|+----+---------------+-----------------+|3|MySQL完全手冊|學(xué)習(xí)MySQL的一切|+----+---------------+-----------------+1rowinset(0.00sec)3,查詢擴(kuò)展模式,比如要搜索數(shù)據(jù)庫,那么MySQL,oracle,DB2也都將會(huì)被搜索到,mysql>SELECT*FROMarticles->WHEREMATCH(title,body)->AGAINST('數(shù)據(jù)庫'WITHQUERYEXPANSION);+----+------------------+--------------------------------------+|id|title|body|+----+------------------+--------------------------------------+|1|數(shù)據(jù)庫管理|在本教程中我將向你展示如何管理數(shù)據(jù)庫|4|數(shù)據(jù)庫與事務(wù)處理|系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論|2|數(shù)據(jù)庫應(yīng)用開發(fā)|學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序||5|NoSQL精髓|學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫||6|SQL語言詳解|詳細(xì)了解如果使用各種SQL||3|MySQL完全手冊|學(xué)習(xí)MySQL的一切|+----+------------------+--------------------------------------+6rowsinset(0.01sec)當(dāng)然,我這里只是功能演示,更多的性能測試,大家有興趣可以進(jìn)行詳細(xì)測試。由于N-grm是中文檢索常用的分詞算法,已經(jīng)在互聯(lián)網(wǎng)大量使用,這次集成到mysql中,想必效果上不會(huì)有太大的問題。

怎么修改mysql的my.inl

在mysql文件下找到ini,右鍵選擇記事本方式打開,然后找到你要修改的內(nèi)容,修改后保存即可

mysql數(shù)據(jù)庫binlog是否可能會(huì)讀取臟數(shù)據(jù)

之前有做過一個(gè)binlog壓縮能節(jié)約多少空間的測試,效果上看還是比較理想的,可以節(jié)約一半以上的空間。但是這個(gè)又引出了一個(gè)新的問題,那就是這個(gè)功能對性能有多大影響呢?于是我又在測試環(huán)境試了一下,測試環(huán)境的物理配置如下。

根據(jù)之前的經(jīng)驗(yàn)這套測試環(huán)境在120個(gè)表+240個(gè)并發(fā)的情況,可以取得一個(gè)性能上的極大值;所以在這里就直接使用這個(gè)作為測試壓力。

8.0.19場景

第一步:安裝。

dbma-cli-single-instance--port=3306--max-mem=131072\--pkg=mysql-8.0.19-linux-glibc2.12-x86_64.tar.xzinstall

第二步:創(chuàng)建測試用戶。

createusersysbench@'%'identifiedby'sysbench';createdatabasetempdb;grantallontempdb.*tosysbench@'%';

第三步:填充數(shù)據(jù)并進(jìn)行壓力測試。

sysbench--mysql-host=192.168.100.10--mysql-port=3306--mysql-user=sysbench\--mysql-password=sysbench--tables=120--table_size=100000--mysql-db=tempdb\--time=3600--threads=240oltp_point_selectpreparesysbench--mysql-host=192.168.100.10--mysql-port=3306--mysql-user=sysbench\--mysql-password=sysbench--tables=120--table_size=100000--mysql-db=tempdb\--time=3600--threads=240oltp_point_selectrun

性能表現(xiàn)。

資源消耗情況。

8.0.20+binlog壓縮

第一步:安裝。

dbma-cli-single-instance--port=3306--max-mem=131072\--pkg=mysql-8.0.20-linux-glibc2.12-x86_64.tar.xzinstall

第二步:創(chuàng)建測試用戶。

createusersysbench@'%'identifiedby'sysbench';createdatabasetempdb;grantallontempdb.*tosysbench@'%';--dbm-agent默認(rèn)會(huì)開啟binlog壓縮showglobalvariableslike'binlog_transaction_compression%';+-------------------------------------------+-------+|Variable_name|Value|+-------------------------------------------+-------+|binlog_transaction_compression|ON||binlog_transaction_compression_level_zstd|3|+-------------------------------------------+-------+2rowsinset(0.00sec)

第三步:填充數(shù)據(jù)并進(jìn)行壓力測試。

sysbench--mysql-host=192.168.100.10--mysql-port=3306--mysql-user=sysbench\--mysql-password=sysbench--tables=120--table_size=100000--mysql-db=tempdb\--time=3600--threads=240oltp_point_selectpreparesysbench--mysql-host=192.168.100.10--mysql-port=3306--mysql-user=sysbench\--mysql-password=sysbench--tables=120--table_size=100000--mysql-db=tempdb\--time=3600--threads=240oltp_point_selectrun

性能表現(xiàn)。

資源消耗情況。

8.0.20+binlog不壓縮

第一步:關(guān)閉binlog壓縮功能。

set@@global.binlog_transaction_compression='OFF';showglobalvariableslike'binlog_transaction_compression%';+-------------------------------------------+-------+|Variable_name|Value|+-------------------------------------------+-------+|binlog_transaction_compression|OFF||binlog_transaction_compression_level_zstd|3|+-------------------------------------------+-------+2rowsinset(0.01sec)

第二步:進(jìn)行壓力測試。

sysbench--mysql-host=192.168.100.10--mysql-port=3306--mysql-user=sysbench\--mysql-password=sysbench--tables=120--table_size=100000--mysql-db=tempdb\--time=3600--threads=240oltp_point_selectrun

性能表現(xiàn)。

資源消耗情況。

結(jié)論

開啟binlog壓縮會(huì)對性能有影響,大概會(huì)讓性能下降1%,cpu多消耗1%。

mysql查詢in為什么用不上索引

1.mysql查詢in用不上索引,說明查詢語句本身有問題。

2.MySQL是查詢語句,最好用Access2010來操作。

3.查詢是用來操作數(shù)據(jù)庫中的記錄對象,利用它可以按照預(yù)先定義的不同條件從數(shù)據(jù)表或其它查詢中篩選出需要操作的字段,并可以把它們集中起來,形成動(dòng)態(tài)數(shù)據(jù)集。用戶可以瀏覽、查詢、打印,甚至修改這個(gè)動(dòng)態(tài)數(shù)據(jù)集中的數(shù)據(jù)。

4.通過查詢,可以查找和檢索滿足指定條件的數(shù)據(jù),包括幾個(gè)表中的數(shù)據(jù),也可以使用查詢同時(shí)更新或刪除幾個(gè)記錄,以及對數(shù)據(jù)執(zhí)行預(yù)定義或自定義的計(jì)算。

5.使用查詢可以回答有關(guān)數(shù)據(jù)的特定問題,而這些問題通過表很難解決。可以使用查詢篩選數(shù)據(jù)、執(zhí)行數(shù)據(jù)計(jì)算和匯總數(shù)據(jù)。可以使用查詢自動(dòng)執(zhí)行許多數(shù)據(jù)管理任務(wù),并在提交數(shù)據(jù)更改之前查看這些更改。

6.查詢實(shí)際上也就是選取記錄的條件。查詢出來的數(shù)據(jù)也存儲(chǔ)到一個(gè)臨時(shí)的表中。用于從表中檢索數(shù)據(jù)或者進(jìn)行計(jì)算的查詢稱為選擇查詢,用于添加、更改或刪除的查詢叫做操作查詢。

mysql補(bǔ)齊缺省數(shù)據(jù)

你給的信息太少,我給你舉例吧,假設(shè)下表B,是這樣的(--只是為了格式):

idclass_idclassinfo

1-----1------明星。。。。。

2---------------軍事。。。。。

3------3-----------------。。。。。

4--------------------------高考分?jǐn)?shù)

類別表C

class_idclass

1----明星

2-----軍事

3-----體育

4-----高考

比如上面這樣的一個(gè)情況,你需要補(bǔ)齊類別信息,class_id或者class信息。

一、首先,使用select統(tǒng)計(jì)缺失情況。

統(tǒng)計(jì)class_id缺失的有多少:selectcount(*)frombwhereclass_idisnullorclass_id=''andclassisnotnull;

統(tǒng)計(jì)class缺失的有多少:selectcount(*)frombwhereclassisnullorclass_id=''andclass_idisnotnull;

在正式更新之前,建議,先備份一次,或者創(chuàng)建一張復(fù)制表。

createtableb_testselect*fromb;數(shù)據(jù)太大,就換一種方式:

createtableb_testselect*frombwhere1=2;這樣就只創(chuàng)建一張表結(jié)構(gòu),沒有數(shù)據(jù),

裝載數(shù)據(jù):

insertintob_testselect*frombwhereid<20000;

依次類推,直到裝載完畢。千萬不要直接在原表上直接更新。

如果統(tǒng)計(jì)的數(shù)量較多,例如超過10w,請分批執(zhí)行。

補(bǔ)齊class:updateb_test,csetb_test.class=c.classwhereb_test.class_id=c.class_idandb_test.idin(selectidfromb_testwhereclassisnullorclass_id=''andclass_idisnotnulllimit0,20000);

每次只會(huì)2w行的更新,多次執(zhí)行上面SQL語句,對應(yīng)修改b_test.idin(selectidfromb_testwhereclassisnullorclass_id=''andclass_idisnotnulllimit20000,40000);

依次類推。

補(bǔ)齊class_id:其實(shí)也一樣:

updateb_test,csetb_test.class_id=c.class_idwhereb_test.class=c.classandb_test.idin(selectidfromb_testwhereclassisnullorclass_id=''andslass_idisnotnulllimit0,20000;

使用統(tǒng)計(jì)的SQL,確認(rèn)一次,是否還有沒有修改到的。

最后剩下,class和class_id都沒有的,

你可能只有手動(dòng)處理了?;蛘?/p>

updateb_testsetb_test.id=4,b_test.class='高考'whereinfolike'%高考%';

希望能幫助你解決問題。有任何問題,歡迎私信我。

mysql中怎樣對大批量級的數(shù)據(jù)查詢進(jìn)行優(yōu)化

MySQL一直以來都支持正則匹配,不過對于正則替換則一直到MySQL8.0才支持。對于這類場景,以前要么在MySQL端處理,要么把數(shù)據(jù)拿出來在應(yīng)用端處理。

比如我想把表y1的列str1的出現(xiàn)第3個(gè)action的子串替換成dble,怎么實(shí)現(xiàn)?

1.自己寫SQL層的存儲(chǔ)函數(shù)。代碼如下寫死了3個(gè),沒有優(yōu)化,僅僅作為演示,MySQL里非常不建議寫這樣的函數(shù)。

mysql

DELIMITER$$

USE`ytt`$$

DROPFUNCTIONIFEXISTS`func_instr_simple_ytt`$$

CREATEDEFINER=`root`@`localhost`FUNCTION`func_instr_simple_ytt`(

f_strVARCHAR(1000),--Parameter1

f_substrVARCHAR(100),--Parameter2

f_replace_strvarchar(100),

f_timesint--timescounter.onlysupport3.

)RETURNSvarchar(1000)

BEGIN

declarev_resultvarchar(1000)default'ytt';--result.

declarev_substr_lenintdefault0;--searchstringlength.

setf_times=3;--onlysupport3.

setv_substr_len=length(f_substr);

selectinstr(f_str,f_substr)into@p1;--Firstrealposition.

selectinstr(substr(f_str,@p1+v_substr_len),f_substr)into@p2;Secondaryvirtualposition.

selectinstr(substr(f_str,@p2+@p1+2*v_substr_len-1),f_substr)into@p3;--Thirdvirtualposition.

if@p1>0&&@p2>0&&@p3>0then--Fine.

select

concat(substr(f_str,1,@p1+@p2+@p3+(f_times-1)*v_substr_len-f_times)

,f_replace_str,

substr(f_str,@p1+@p2+@p3+f_times*v_substr_len-2))intov_result;

else

setv_result=f_str;--Neverchanged.

endif;

--Purgeallsessionvariables.

set@p1=null;

set@p2=null;

set@p3=null;

returnv_result;

end;

$$

DELIMITER;

--調(diào)用函數(shù)來更新:

mysql>updatey1setstr1=func_instr_simple_ytt(str1,'action','dble',3);

QueryOK,20rowsaffected(0.12sec)

Rowsmatched:20Changed:20Warnings:0

2.導(dǎo)出來用sed之類的工具替換掉在導(dǎo)入,步驟如下:(推薦使用)1)導(dǎo)出表y1的記錄。

mysqlmysql>select*fromy1intooutfile'/var/lib/mysql-files/y1.csv';QueryOK,20rowsaffected(0.00sec)

2)用sed替換導(dǎo)出來的數(shù)據(jù)。

shellroot@ytt-Aspire-V5-471G:/var/lib/mysql-files#sed-i's/action/dble/3'y1.csv

3)再次導(dǎo)入處理好的數(shù)據(jù),完成。

mysql

mysql>truncatey1;

QueryOK,0rowsaffected(0.99sec)

mysql>loaddatainfile'/var/lib/mysql-files/y1.csv'intotabley1;

QueryOK,20rowsaffected(0.14sec)

Records:20Deleted:0Skipped:0Warnings:0

以上兩種還是推薦導(dǎo)出來處理好了再重新導(dǎo)入,性能來的高些,而且還不用自己費(fèi)勁寫函數(shù)代碼。那MySQL8.0對于以上的場景實(shí)現(xiàn)就非常簡單了,一個(gè)函數(shù)就搞定了。

mysqlmysql>updatey1setstr1=regexp_replace(str1,'action','dble',1,3);QueryOK,20rowsaffected(0.13sec)Rowsmatched:20Changed:20Warnings:0

還有一個(gè)regexp_instr也非常有用,特別是這種特指出現(xiàn)第幾次的場景。比如定義SESSION變量@a。

mysqlmysql>set@a='aabbcceefilucy111bs234523556119101020301040';QueryOK,0rowsaffected(0.04sec)

拿到至少兩次的數(shù)字出現(xiàn)的第二次子串的位置。

mysqlmysql>selectregexp_instr(@a,'[:digit:]{2,}',1,2);+--------------------------------------+|regexp_instr(@a,'[:digit:]{2,}',1,2)|+--------------------------------------+|50|+--------------------------------------+1rowinset(0.00sec)

那我們在看看對多字節(jié)字符支持如何。

mysql

mysql>set@a='中國美國俄羅斯日本中國北京上海深圳廣州北京上海武漢東莞北京青島北京';

QueryOK,0rowsaffected(0.00sec)

mysql>selectregexp_instr(@a,'北京',1,1);

+-------------------------------+

|regexp_instr(@a,'北京',1,1)|

+-------------------------------+

|17|

+-------------------------------+

1rowinset(0.00sec)

mysql>selectregexp_instr(@a,'北京',1,2);

+-------------------------------+

|regexp_instr(@a,'北京',1,2)|

+-------------------------------+

|29|

+-------------------------------+

1rowinset(0.00sec)

mysql>selectregexp_instr(@a,'北京',1,3);

+-------------------------------+

|regexp_instr(@a,'北京',1,3)|

+-------------------------------+

|41|

+-------------------------------+

1rowinset(0.00sec)

那總結(jié)下,這里我提到了MySQL8.0的兩個(gè)最有用的正則匹配函數(shù)regexp_replace和regexp_instr。針對以前類似的場景算是有一個(gè)完美的解決方案。

mysql的in數(shù)量太多的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于mysql 大量in解決、mysql的in數(shù)量太多的信息別忘了在本站進(jìn)行查找哦。