欧美经典成人在观看线视频_嫩草成人影院_国产在线精品一区二区中文_国产欧美日韩综合二区三区

當前位置:首頁 > 前端設計 > 正文

mysql的in數量太多?mysql 大量in解決

mysql的in數量太多?mysql 大量in解決

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

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

mysql的中文全文搜索,關于分詞,有沒有好的解決方案

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

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

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

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

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

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||習m|4|4|1|4|21||習了|6|6|1|6|16||習開|3|3|1|3|25||習數|5|5|1|5|37||了解|6|7|2|6|19||了解|6|7|2|7|23||事務|5|5|1|5|12||事務|5|5|1|5|40||何管|2|2|1|2|52|+------+--------------+-------------+-----------+--------+----------+10rowsinset(0.00sec)這里可以看到,把分詞長度設置為2,所有的數據都只有兩個一組。上面數據還包含了行的位置,ID等等信息。

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

怎么修改mysql的my.inl

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

mysql數據庫binlog是否可能會讀取臟數據

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

根據之前的經驗這套測試環境在120個表+240個并發的情況,可以取得一個性能上的極大值;所以在這里就直接使用這個作為測試壓力。

8.0.19場景

第一步:安裝。

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

第二步:創建測試用戶。

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

第三步:填充數據并進行壓力測試。

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

性能表現。

資源消耗情況。

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

第二步:創建測試用戶。

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

第三步:填充數據并進行壓力測試。

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

性能表現。

資源消耗情況。

8.0.20+binlog不壓縮

第一步:關閉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)

第二步:進行壓力測試。

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

性能表現。

資源消耗情況。

結論

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

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

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

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

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

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

5.使用查詢可以回答有關數據的特定問題,而這些問題通過表很難解決。可以使用查詢篩選數據、執行數據計算和匯總數據。可以使用查詢自動執行許多數據管理任務,并在提交數據更改之前查看這些更改。

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

mysql補齊缺省數據

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

idclass_idclassinfo

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

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

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

4--------------------------高考分數

類別表C

class_idclass

1----明星

2-----軍事

3-----體育

4-----高考

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

一、首先,使用select統計缺失情況。

統計class_id缺失的有多少:selectcount(*)frombwhereclass_idisnullorclass_id=''andclassisnotnull;

統計class缺失的有多少:selectcount(*)frombwhereclassisnullorclass_id=''andclass_idisnotnull;

在正式更新之前,建議,先備份一次,或者創建一張復制表。

createtableb_testselect*fromb;數據太大,就換一種方式:

createtableb_testselect*frombwhere1=2;這樣就只創建一張表結構,沒有數據,

裝載數據:

insertintob_testselect*frombwhereid<20000;

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

如果統計的數量較多,例如超過10w,請分批執行。

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

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

依次類推。

補齊class_id:其實也一樣:

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

使用統計的SQL,確認一次,是否還有沒有修改到的。

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

你可能只有手動處理了。或者

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

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

mysql中怎樣對大批量級的數據查詢進行優化

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

比如我想把表y1的列str1的出現第3個action的子串替換成dble,怎么實現?

1.自己寫SQL層的存儲函數。代碼如下寫死了3個,沒有優化,僅僅作為演示,MySQL里非常不建議寫這樣的函數。

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;

--調用函數來更新:

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

QueryOK,20rowsaffected(0.12sec)

Rowsmatched:20Changed:20Warnings:0

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

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

2)用sed替換導出來的數據。

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

3)再次導入處理好的數據,完成。

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

以上兩種還是推薦導出來處理好了再重新導入,性能來的高些,而且還不用自己費勁寫函數代碼。那MySQL8.0對于以上的場景實現就非常簡單了,一個函數就搞定了。

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

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

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

拿到至少兩次的數字出現的第二次子串的位置。

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

那我們在看看對多字節字符支持如何。

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)

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

mysql的in數量太多的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于mysql 大量in解決、mysql的in數量太多的信息別忘了在本站進行查找哦。