国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

            當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > Mysql中,like與regexp的區(qū)別?

            Mysql中,like與regexp的區(qū)別?

            來(lái)源:千鋒教育
            發(fā)布人:xqq
            時(shí)間: 2023-10-14 00:26:59 1697214419

            一、Mysql中,like與regexp的區(qū)別

            1、適用對(duì)象不同

            LIKE 函數(shù)適用于簡(jiǎn)單的通配符匹配,例如使用百分號(hào)(%)匹配任意字符,或使用下劃線(_)匹配單個(gè)字符。與此相反,REGEXP 函數(shù)支持更靈活、更強(qiáng)大的正則表達(dá)式模式匹配功能。

            2、速度不同

            LIKE 函數(shù)比 REGEXP 函數(shù)更快,因?yàn)樗ǔD軌蚴褂盟饕齼?yōu)化查詢(xún)操作,即使查詢(xún)中使用了通配符。但對(duì)于復(fù)雜的模式匹配,REGEXP 函數(shù)的性能通常也非常出色。

            3、語(yǔ)法不同

            LIKE 函數(shù)和 REGEXP 函數(shù)還存在一些語(yǔ)法差異,例如使用LIKE函數(shù)時(shí)可以使用轉(zhuǎn)義字符來(lái)表示通配符字符本身,而使用REGEXP函數(shù)時(shí)需要使用反斜杠來(lái)表示正則表達(dá)式字符本身。

            二、MySQL的模糊查詢(xún)

            為了便于描述和測(cè)試不同模糊查詢(xún)方式結(jié)果,首先給出一個(gè)簡(jiǎn)單的測(cè)試用數(shù)據(jù)表tests如下:

            其中,tests表僅含有一個(gè)名為words的字段,并對(duì)該字段添加全文索引。表中共有6條記錄。

            1、Like

            Like算作MySQL中的謂詞,其應(yīng)用與is、=、>和<等符號(hào)用法類(lèi)似。Like主要支持兩種通配符,分別是”_”和”%”,其中前者代表匹配1個(gè)任意字符,常用于充當(dāng)占位符;而后者代表匹配0個(gè)或多個(gè)任意字符。從某種意義上講,Like可看作是一個(gè)精簡(jiǎn)的正則表達(dá)式功能。

            例如,在如上表中查找所有以”hello”開(kāi)頭的記錄,則其SQL語(yǔ)句為:

            SELECT words FROM tests WHERE words LIKE 'hello%';

            查詢(xún)結(jié)果:

            如果想查找所有以”hello”開(kāi)頭且至少含有6個(gè)字符的記錄,則可簡(jiǎn)單修改SQL語(yǔ)句如下:

            SELECT words FROM tests WHERE words LIKE 'hello_%';

            查詢(xún)結(jié)果:

            另外,當(dāng)在Like模式字段中,若不包含任何”_”和”%”通配符,則等價(jià)于”=”,表示精確匹配,例如查詢(xún)語(yǔ)句……Like “hello”,則僅返回hello一條記錄;還可在Like前加限定詞Not,表示結(jié)果取反。

            2、RegExp

            正則表達(dá)式具有龐大而豐富的語(yǔ)法,MySQL語(yǔ)法中支持絕大部分正則表達(dá)式功能,幾乎可以滿足所有需求。本文不過(guò)多展開(kāi)正則表達(dá)式相關(guān)介紹,僅在Like的基礎(chǔ)上,簡(jiǎn)單介紹其與Like模糊搜索方式的區(qū)別。

            如前所述,Like匹配原則是要求模式串與整個(gè)目標(biāo)字段匹配時(shí),才返回該條記錄;而RegExp中則是當(dāng)目標(biāo)字段包含模式串時(shí)即返回該條記錄。例如如下SQL語(yǔ)句將返回所有包含”hello”的記錄:

            SELECT words FROM tests WHERE words REGEXP 'hello';

            而在Like中這樣的寫(xiě)法僅返回記錄=”hello”的記錄。為了限定正則表達(dá)式以某個(gè)模式串開(kāi)頭或者結(jié)尾,可以通過(guò)添加”^”和”$”標(biāo)識(shí)符來(lái)限定,例如仍然搜索以”hello”開(kāi)頭的目標(biāo)字段,則其SQL語(yǔ)句為:

            SELECT words FROM tests WHERE words REGEXP '^hello';

            3、內(nèi)置函數(shù)

            對(duì)于包含某些特定模式串的模糊搜索,可以通過(guò)MySQL內(nèi)置函數(shù)實(shí)現(xiàn)??梢酝瓿蛇@一功能的函數(shù)包括Instr()、Locate()和Position()等,其功能語(yǔ)法很相近,均是返回子串在字符串中的索引,且索引下標(biāo)從1開(kāi)始,當(dāng)子串不存在是返回0。需要注意的是三個(gè)函數(shù)中子串和字符串的先后順序是不一致的。例如以下語(yǔ)句均成功檢索,且返回目標(biāo)索引1。

            SELECT INSTR("hello,world", 'hello');-- 1 SELECT LOCATE('hello', "hello,world");-- 1 SELECT POSITION('hello' in "hello, world"); -- 1

            應(yīng)用以上3個(gè)內(nèi)置函數(shù),搜索上述測(cè)試表中包含”hello”的記錄,則相應(yīng)SQL語(yǔ)句為:

            SELECT words  FROM tests WHERE INSTR(words, 'hello'); SELECT words  FROM tests WHERE LOCATE('hello', words); SELECT words  FROM tests WHERE POSITION('hello' in words);

            4、全文索引

            全文索引是MySQL中索引的一種,曾經(jīng)僅在引擎為MyISAM的表中支持,從5.6版本開(kāi)始在InnoDB中也開(kāi)始支持全文索引,支持的字段格式包括CHAR、VARCHAR和TEXT。在如上已經(jīng)添加了全文索引的tests表中,仍然查詢(xún)包含”hello”的記錄,應(yīng)用全文索引查詢(xún)的SQL語(yǔ)句為:

            SELECT words FROM tests WHERE MATCH(words) against('hello');

            實(shí)際上,MATCH(words) against(‘hello’)返回的是字段words對(duì)目標(biāo)字符”hello”的匹配程度:當(dāng)不存在任何匹配結(jié)果時(shí),返回0;否則,根據(jù)匹配次數(shù)的多少和位置先后返回一個(gè)匹配度。例如,如下SQL語(yǔ)句返回表中每條記錄對(duì)目標(biāo)字段”hello”的匹配度:

            SELECT MATCH(words) against('hello') FROM tests;

            返回結(jié)果如下:

            5、查詢(xún)性能對(duì)比

            為了對(duì)比以上4種模糊搜索方式的性能,我們這里構(gòu)建一個(gè)規(guī)模較大且更具一般性的數(shù)據(jù)表。本文選擇采集若干條英文格言,用于創(chuàng)建目標(biāo)數(shù)據(jù)庫(kù)。創(chuàng)建數(shù)據(jù)表。為簡(jiǎn)單起見(jiàn),僅創(chuàng)建一個(gè)名為says的字段,且對(duì)其添加全文索引。

            CREATE TABLE IF NOT EXISTS sayings(says TEXT, FULLTEXT (says));

            英文格言信息獲?。涸诰W(wǎng)上找了個(gè)英文格言的網(wǎng)站,并寫(xiě)了一個(gè)python小爬蟲(chóng)爬取頁(yè)面全部300條英文格言,爬蟲(chóng)源碼如下(為了增加記錄條數(shù),將300條記錄重寫(xiě)100詞,即數(shù)據(jù)庫(kù)中包含30000條記錄):

            from pyquery import PyQuery  as pq  from pymysql import connect  doc = pq(url='http://www.1juzi.com/new/43141.html', encoding = 'gb18030') items=doc("div.content>p:nth-child(2n+1)").items()  hots = [item.text() for item in items]  with connect(host="localhost", user="root", password="123456", db='teststr', charset='utf8') as cur:      sql_insert = 'insert into sayings values (%s);'      for _ in range(100):         cur.executemany(sql_insert, hots)

            對(duì)爬取的英文短句寫(xiě)入創(chuàng)建的數(shù)據(jù)表中。既然是英文勵(lì)志格言短句,那么我們就來(lái)查詢(xún)其中包括”success”的記錄。首先查詢(xún)語(yǔ)句中任意位置包含“success”的記錄,4種方式SQL語(yǔ)句及執(zhí)行時(shí)間為:

            -- LIKE通配符  SELECT says FROM sayings WHERE says LIKE '%success%'  > OK  > 時(shí)間: 0.036s  -- REGEXP正則匹配  SELECT says FROM sayings WHERE says REGEXP 'success'  > OK  > 時(shí)間: 0.053s -- 內(nèi)置函數(shù)查找 SELECT says FROM sayings WHERE INSTR(says, 'success') > OK > 時(shí)間: 0.045s SELECT says FROM sayings WHERE LOCATE('success', says) > OK > 時(shí)間: 0.044s SELECT says FROM sayings WHERE POSITION('success' in says) > OK > 時(shí)間: 0.047s -- 全文索引 SELECT says FROM sayings WHERE MATCH(says) against('Success') > OK > 時(shí)間: 0.006s

            可見(jiàn),全文索引速度最寬,名列前茅其他方式接近一個(gè)量級(jí);Like通配符速度其次,但與其他幾種查詢(xún)方式效率相差不大。通過(guò)Explain查詢(xún)計(jì)劃,我們可以發(fā)現(xiàn)全文索引方式由于應(yīng)用了索引而無(wú)需全表查詢(xún),所以執(zhí)行速度快,而其他三種模糊查詢(xún)方式均為執(zhí)行全表查詢(xún)。

            實(shí)際上,對(duì)于添加索引的字段應(yīng)用Like查詢(xún)時(shí),可以應(yīng)用索引加速查詢(xún),為勒驗(yàn)證全文索引條件下是否仍然可以應(yīng)用索引,我們進(jìn)行第二組性能測(cè)試:查詢(xún)語(yǔ)句中以“success”開(kāi)頭的記錄(全文索引方式不支持指定單詞開(kāi)頭的查詢(xún)?nèi)蝿?wù)),相應(yīng)SQL語(yǔ)句即執(zhí)行時(shí)間如下:

            SELECT says FROM sayings WHERE says LIKE 'success%'  > OK  > 時(shí)間: 0.015s  SELECT says FROM sayings WHERE says REGEXP '^success'  > OK  > 時(shí)間: 0.046s  SELECT says FROM sayings WHERE INSTR(says, 'success')=1 > OK > 時(shí)間: 0.042s SELECT says FROM sayings WHERE LOCATE('success', says)=1 > OK > 時(shí)間: 0.051s SELECT says FROM sayings WHERE POSITION('success' in says)=1 > OK > 時(shí)間: 0.049s 20 21SELECT says FROM sayings WHERE MATCH(says) against('Success') > OK > 時(shí)間: 0.007s

            可以看到,修改后的Like查詢(xún)效率提升明顯,并大幅超過(guò)其他方式。但解釋查詢(xún)計(jì)劃發(fā)現(xiàn),雖然possible_key顯示了索引字段,但實(shí)際仍然未應(yīng)用任何索引(key為null),即仍然進(jìn)行全表查詢(xún)(Type = All)。之所以帶來(lái)速度上的大幅提升,僅僅是因?yàn)閷?duì)’success%’要比’%success%’執(zhí)行字符串匹配要快得多(后者要整列匹配,前者僅需匹配開(kāi)頭的單詞即可),而與索引無(wú)關(guān)。

            所以,得到的結(jié)論是Like通配符無(wú)法有效利用全文索引加速查詢(xún),但在特定模式下的查詢(xún)速度可快于通配符%模式下的查詢(xún)。

            延伸閱讀1:MySQL的優(yōu)勢(shì)

            成本低:開(kāi)放源代碼,社區(qū)版本可以免費(fèi)使用。性能良:執(zhí)行速度快,功能強(qiáng)大。操作簡(jiǎn)單:安裝方便快捷,有多個(gè)圖形客戶(hù)端管理工具(MySQL Workbench/Navicat、MySQLFront, SQLyog等客戶(hù)端)和一些集成開(kāi)發(fā)環(huán)境。兼容性好:安裝于多種操作系統(tǒng),跨平臺(tái)性好,不存在32位和64位機(jī)的兼容,無(wú)法安裝的問(wèn)題。
            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
            請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
            免費(fèi)領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學(xué) 138****2860 剛剛成功領(lǐng)取
            王同學(xué) 131****2015 剛剛成功領(lǐng)取
            張同學(xué) 133****4652 剛剛成功領(lǐng)取
            李同學(xué) 135****8607 剛剛成功領(lǐng)取
            楊同學(xué) 132****5667 剛剛成功領(lǐng)取
            岳同學(xué) 134****6652 剛剛成功領(lǐng)取
            梁同學(xué) 157****2950 剛剛成功領(lǐng)取
            劉同學(xué) 189****1015 剛剛成功領(lǐng)取
            張同學(xué) 155****4678 剛剛成功領(lǐng)取
            鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
            董同學(xué) 138****2867 剛剛成功領(lǐng)取
            周同學(xué) 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            oracle怎么樣實(shí)現(xiàn)數(shù)據(jù)庫(kù)跨機(jī)房同步?

            一、oracle怎么樣實(shí)現(xiàn)數(shù)據(jù)庫(kù)跨機(jī)房同步除了使用第三方工具,Oracle提供了extended cluster可以實(shí)現(xiàn)類(lèi)似的功能,使用Oracle RAC + ASM。簡(jiǎn)單說(shuō)下...詳情>>

            2023-10-14 01:57:43
            web網(wǎng)站性能測(cè)試的常用指標(biāo)有哪些?

            一、頁(yè)面加載時(shí)間頁(yè)面加載時(shí)間是衡量網(wǎng)站性能的重要指標(biāo)之一,它指的是從用戶(hù)請(qǐng)求一個(gè)頁(yè)面到頁(yè)面完全加載完成所需的時(shí)間。頁(yè)面加載時(shí)間的長(zhǎng)短直...詳情>>

            2023-10-14 01:50:34
            MySQL索引為什么能讓查詢(xún)效率提高?

            一、MySQL索引為什么能讓查詢(xún)效率提高DB在執(zhí)行一條Sql語(yǔ)句的時(shí)候,默認(rèn)的方式是根據(jù)搜索條件進(jìn)行全表掃描。如果我們對(duì)某一字段增加索引,查詢(xún)時(shí)...詳情>>

            2023-10-14 01:38:15
            什么是面向云原生系統(tǒng)的智能運(yùn)維?

            一、云原生系統(tǒng)概述云原生系統(tǒng)是指在云計(jì)算環(huán)境下構(gòu)建和運(yùn)行的應(yīng)用程序系統(tǒng),具備高可用、彈性擴(kuò)展、靈活部署和自動(dòng)化管理等特點(diǎn)。它采用容器化...詳情>>

            2023-10-14 01:25:33
            怎么提升excel數(shù)據(jù)表訪問(wèn)運(yùn)算速度?

            一、怎么提升excel數(shù)據(jù)表訪問(wèn)運(yùn)算速度目前版本Excel最大列數(shù)為16384,沒(méi)有10w加。運(yùn)算速度和Excel中是否有公式、公式的復(fù)雜度、對(duì)象的對(duì)少、格...詳情>>

            2023-10-14 01:22:48
            快速通道