色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Mysql中,like與regexp的區別?

Mysql中,like與regexp的區別?

來源:千鋒教育
發布人:xqq
時間: 2023-10-14 00:26:59 1697214419

一、Mysql中,like與regexp的區別

1、適用對象不同

LIKE 函數適用于簡單的通配符匹配,例如使用百分號(%)匹配任意字符,或使用下劃線(_)匹配單個字符。與此相反,REGEXP 函數支持更靈活、更強大的正則表達式模式匹配功能。

2、速度不同

LIKE 函數比 REGEXP 函數更快,因為它通常能夠使用索引優化查詢操作,即使查詢中使用了通配符。但對于復雜的模式匹配,REGEXP 函數的性能通常也非常出色。

3、語法不同

LIKE 函數和 REGEXP 函數還存在一些語法差異,例如使用LIKE函數時可以使用轉義字符來表示通配符字符本身,而使用REGEXP函數時需要使用反斜杠來表示正則表達式字符本身。

二、MySQL的模糊查詢

為了便于描述和測試不同模糊查詢方式結果,首先給出一個簡單的測試用數據表tests如下:

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

1、Like

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

例如,在如上表中查找所有以”hello”開頭的記錄,則其SQL語句為:

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

查詢結果:

如果想查找所有以”hello”開頭且至少含有6個字符的記錄,則可簡單修改SQL語句如下:

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

查詢結果:

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

2、RegExp

正則表達式具有龐大而豐富的語法,MySQL語法中支持絕大部分正則表達式功能,幾乎可以滿足所有需求。本文不過多展開正則表達式相關介紹,僅在Like的基礎上,簡單介紹其與Like模糊搜索方式的區別。

如前所述,Like匹配原則是要求模式串與整個目標字段匹配時,才返回該條記錄;而RegExp中則是當目標字段包含模式串時即返回該條記錄。例如如下SQL語句將返回所有包含”hello”的記錄:

SELECT words FROM tests WHERE words REGEXP 'hello';

而在Like中這樣的寫法僅返回記錄=”hello”的記錄。為了限定正則表達式以某個模式串開頭或者結尾,可以通過添加”^”和”$”標識符來限定,例如仍然搜索以”hello”開頭的目標字段,則其SQL語句為:

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

3、內置函數

對于包含某些特定模式串的模糊搜索,可以通過MySQL內置函數實現。可以完成這一功能的函數包括Instr()、Locate()和Position()等,其功能語法很相近,均是返回子串在字符串中的索引,且索引下標從1開始,當子串不存在是返回0。需要注意的是三個函數中子串和字符串的先后順序是不一致的。例如以下語句均成功檢索,且返回目標索引1。

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

應用以上3個內置函數,搜索上述測試表中包含”hello”的記錄,則相應SQL語句為:

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中索引的一種,曾經僅在引擎為MyISAM的表中支持,從5.6版本開始在InnoDB中也開始支持全文索引,支持的字段格式包括CHAR、VARCHAR和TEXT。在如上已經添加了全文索引的tests表中,仍然查詢包含”hello”的記錄,應用全文索引查詢的SQL語句為:

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

實際上,MATCH(words) against(‘hello’)返回的是字段words對目標字符”hello”的匹配程度:當不存在任何匹配結果時,返回0;否則,根據匹配次數的多少和位置先后返回一個匹配度。例如,如下SQL語句返回表中每條記錄對目標字段”hello”的匹配度:

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

返回結果如下:

5、查詢性能對比

為了對比以上4種模糊搜索方式的性能,我們這里構建一個規模較大且更具一般性的數據表。本文選擇采集若干條英文格言,用于創建目標數據庫。創建數據表。為簡單起見,僅創建一個名為says的字段,且對其添加全文索引。

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

英文格言信息獲取:在網上找了個英文格言的網站,并寫了一個python小爬蟲爬取頁面全部300條英文格言,爬蟲源碼如下(為了增加記錄條數,將300條記錄重寫100詞,即數據庫中包含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)

對爬取的英文短句寫入創建的數據表中。既然是英文勵志格言短句,那么我們就來查詢其中包括”success”的記錄。首先查詢語句中任意位置包含“success”的記錄,4種方式SQL語句及執行時間為:

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

可見,全文索引速度最寬,名列前茅其他方式接近一個量級;Like通配符速度其次,但與其他幾種查詢方式效率相差不大。通過Explain查詢計劃,我們可以發現全文索引方式由于應用了索引而無需全表查詢,所以執行速度快,而其他三種模糊查詢方式均為執行全表查詢。

實際上,對于添加索引的字段應用Like查詢時,可以應用索引加速查詢,為勒驗證全文索引條件下是否仍然可以應用索引,我們進行第二組性能測試:查詢語句中以“success”開頭的記錄(全文索引方式不支持指定單詞開頭的查詢任務),相應SQL語句即執行時間如下:

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

可以看到,修改后的Like查詢效率提升明顯,并大幅超過其他方式。但解釋查詢計劃發現,雖然possible_key顯示了索引字段,但實際仍然未應用任何索引(key為null),即仍然進行全表查詢(Type = All)。之所以帶來速度上的大幅提升,僅僅是因為對’success%’要比’%success%’執行字符串匹配要快得多(后者要整列匹配,前者僅需匹配開頭的單詞即可),而與索引無關。

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

延伸閱讀1:MySQL的優勢

成本低:開放源代碼,社區版本可以免費使用。性能良:執行速度快,功能強大。操作簡單:安裝方便快捷,有多個圖形客戶端管理工具(MySQL Workbench/Navicat、MySQLFront, SQLyog等客戶端)和一些集成開發環境。兼容性好:安裝于多種操作系統,跨平臺性好,不存在32位和64位機的兼容,無法安裝的問題。
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
美女视频黄免费的久久| 男女视频一区二区| 欧美大白屁股肥臀xxxxxx| 激情六月婷婷久久| 国产日韩欧美制服另类| 在线观看91av| 99久久99久久免费精品蜜臀| 欧美一级精品在线| 亚洲成人免费av| 日韩久久久精品| 日韩精品一区二区三区swag| 亚洲一卡二卡三卡四卡| 色婷婷精品大视频在线蜜桃视频| 精品久久人人做人人爰| 久久精品国产澳门| 欧美一级精品在线| 久久国产精品第一页| 欧美精品日韩一本| 日韩精品乱码免费| 日韩一区二区三区电影在线观看 | 亚洲另类春色校园小说| 99国内精品久久| 成人免费一区二区三区视频| 欧美一级日韩免费不卡| 视频一区二区三区在线| 欧美一区二区久久久| 国产精品一线二线三线精华| 国产日韩精品视频一区| www.一区二区| 综合中文字幕亚洲| 色哦色哦哦色天天综合| 亚洲成人自拍网| 精品国产在天天线2019| 风间由美一区二区av101| 亚洲婷婷综合久久一本伊一区 | 一本久道久久综合中文字幕| 亚洲一区二区黄色| 欧美一级久久久| 色综合色狠狠综合色| 久久狠狠亚洲综合| 日韩黄色小视频| 一区二区三区精品久久久| 国产精品乱子久久久久| 久久综合九色欧美综合狠狠| 欧美变态口味重另类| 2欧美一区二区三区在线观看视频| 91精品久久久久久久99蜜桃| 成人免费av资源| 亚洲电影一级黄| 久久久久久**毛片大全| 韩国欧美国产1区| 依依成人综合视频| 久久久久久综合| 精品视频在线免费观看| 亚洲高清三级视频| 亚洲欧洲日韩av| 欧美性色综合网| 国产精品一区三区| 精品在线免费观看| 激情都市一区二区| 久久精品国产亚洲高清剧情介绍 | 日产国产高清一区二区三区| 亚洲国产精品ⅴa在线观看| 日韩一级大片在线观看| 51精品国自产在线| 欧美人与z0zoxxxx视频| 在线播放欧美女士性生活| 欧美丝袜自拍制服另类| 色综合天天综合给合国产| av在线播放一区二区三区| 国产毛片精品视频| 国产精品一二三四区| www.欧美.com| 青青草原综合久久大伊人精品 | 久久精品亚洲精品国产欧美| 制服丝袜日韩国产| 成人精品免费网站| 91在线观看视频| 欧美日韩一级二级| 精品粉嫩aⅴ一区二区三区四区| 久久久www成人免费毛片麻豆| 国产欧美久久久精品影院| 国产精品久久久久一区二区三区| 中文字幕一区二区三区四区| 亚洲风情在线资源站| 国产一区二三区| 国产一区在线不卡| 国产福利91精品一区二区三区| www.色综合.com| 欧美成人国产一区二区| 亚洲欧美在线另类| 久久精品国产色蜜蜜麻豆| 91色在线porny| 久久久精品日韩欧美| 午夜天堂影视香蕉久久| 91在线观看免费视频| 精品久久99ma| 日韩福利电影在线| 在线观看视频91| 亚洲另类色综合网站| 亚洲一区二区三区激情| 97se狠狠狠综合亚洲狠狠| 日韩精品一区二区三区在线| 一级女性全黄久久生活片免费| 成人黄色网址在线观看| 26uuuu精品一区二区| 三级一区在线视频先锋| 欧美精品日日鲁夜夜添| 日韩高清欧美激情| 精品国产免费人成电影在线观看四季| 国产日产欧美一区| 国产精品911| 国产精品二三区| 99re成人精品视频| 亚洲精品中文字幕乱码三区| 色综合天天综合狠狠| 亚洲一区在线免费观看| 欧美一卡2卡3卡4卡| 美女视频黄 久久| 久久综合狠狠综合| 91免费在线看| 日韩国产欧美三级| 国产日韩精品一区| 欧美亚洲一区二区三区四区| 亚洲精品国产a久久久久久| 欧美电影一区二区三区| 国产成人h网站| 午夜精品久久久久久久99水蜜桃| 精品久久免费看| 91国偷自产一区二区使用方法| 日本午夜精品视频在线观看| 国产精品福利av| 久久影院午夜论| 91麻豆精品国产91久久久使用方法| 国产aⅴ精品一区二区三区色成熟| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲激情自拍视频| 国产女人aaa级久久久级| 日韩美女视频在线| 欧美丝袜自拍制服另类| 欧美综合一区二区三区| 色狠狠桃花综合| 老司机午夜精品| 免费成人结看片| 日韩黄色在线观看| 污片在线观看一区二区| 亚洲va国产天堂va久久en| 亚洲一区二区三区四区不卡| 亚洲免费资源在线播放| 亚洲欧美日韩国产手机在线| 国产精品国产三级国产aⅴ入口| 91麻豆精品国产91久久久久久久久 | 欧美一级黄色大片| 欧美日韩一区二区三区视频| 欧日韩精品视频| 91精品国产综合久久福利| 欧美老肥妇做.爰bbww视频| 欧美日韩免费高清一区色橹橹| 欧美日韩一区二区三区免费看 | 精品国产区一区| 在线精品视频免费观看| 欧美日韩一区二区三区四区五区| 精品视频123区在线观看| 日韩精品中文字幕一区 | 国产精品久久久久一区| 一区二区久久久| 国产乱码精品一区二区三区av | 欧美日韩在线播放三区| 日韩一区二区免费电影| 91精品婷婷国产综合久久竹菊| 欧美国产日本韩| 日韩电影网1区2区| 93久久精品日日躁夜夜躁欧美| 欧美色视频在线观看| 欧美视频在线播放| 国产欧美中文在线| 午夜激情一区二区| 麻豆国产一区二区| 欧美绝品在线观看成人午夜影视| 欧美精品乱人伦久久久久久| 亚洲女同一区二区| 91精品免费观看| 精品久久一区二区| 精品夜夜嗨av一区二区三区| 91在线免费播放| 欧美人伦禁忌dvd放荡欲情| 亚洲精品日韩一| 一本久久精品一区二区| 国产精品久久久爽爽爽麻豆色哟哟| 麻豆精品国产91久久久久久| 日韩一区二区三| 日本欧美大码aⅴ在线播放| 欧美色图激情小说| 男男成人高潮片免费网站| 日韩小视频在线观看专区| 美女视频网站久久| 国产日韩欧美一区二区三区综合| 日韩国产欧美在线播放| 精品日韩欧美在线| 粉嫩一区二区三区性色av|