MySQL 優化 FIND IN SET 使用

2021-10-10 05:02:21 字數 2119 閱讀 8065

背景最近在優化專案遇到乙個場景:資料庫表中某個字段儲存是多個字串連線的;

如 合同1(contract1) 對應多個聯絡人:linker1,linker2,這樣 合同a 的id 對應訂單的儲存就是 order1,order2;

我們需要查詢 linker2 和 多少個合同有關;怎麼辦呢?使用 find_in_set 函式

簡述

mysql手冊中find_in_set函式的語法:

find_in_set(str,strlist)

str 要查詢的字串

strlist 欄位名 引數以」,」分隔 如 (1,2,3,4)

查詢字段(strlist)中包含(str)的結果,返回結果為null或記錄

假如字串str在由n個子鏈組成的字串列表strlist 中,則返回值的範圍在 1 到 n 之間。

乙個字串列表就是乙個由一些被 『,』 符號分開的子鏈組成的字串。

如果 第乙個引數是乙個常數字串,而第二個是 set 列,則find_in_set() 函式被優化,使用位元計算。

如果str不在strlist 或strlist 為空字串,則返回值為 0 。

若任意乙個引數為null,則返回值為 null。

注意:這個函式在第乙個引數包含乙個逗號(『,』)時將無法正常執行,第二個引數必須以","分割開

簡單使用
select * from contract where find_in_set(id, '1,2,3,4,5');

id 是乙個表的字段,然後每條記錄分別是id等於1,2,3,4,5的時候。

使用find_in_set函式一次返回多條記錄

是不是發現和 in 一樣啊 (集合)

select * from treenodes where id in (1,2,3,4,5);

和 in 的區別
create table `user_info` (

`id` int(8) not null auto_increment,

`name` varchar(16) not null,

`friends` varchar(32) not null,

primary key (`id`)

);insert into `user_info` values (1, 'name1', 'xiaowang,xiaohai,xiaoyang');

insert into `user_info` values (2, 'name2', 'xiaotong,xiaodao,xiaocheng');

insert into `user_info` values (3, 'name3', 'xiaotong,xiaodao,xiaohai');

現在搜尋 friends 中包含 xiaodao 的記錄,使用in

select * from user_info where 'xiaodao' in(friends);
查詢不到任何資料,因為in 函式 只有當 friends 字段等於 xiaodao 的時候才可以 搜尋的到記錄

現在看看 find_in_set 函式

select * from user_info where find_in_set( 'xiaodao', friends);
這樣就顯示關於 xiaodao 的記錄了。

和 like 的區別

剛才的例子有的人為啥不用 like;沒錯,使用like也是可以查詢出來的,只是在使用模糊匹配可能查詢出錯誤資料

insert into `user_info` values (4, 'name1', 'xiaowang,xiaohai,xiaodao2');

insert into `user_info` values (5, 'name1', 'xiaowang,xiaohai,1xiaodao');

如果使用like 查詢的話

select * from user_info where friends like '%xiaodao%';
這樣就會把 不相關的xiaodao2 ,1xiaodao 查詢出來

mysql的優化 MySQL優化

一 sql語句優化 1 使用limit對查詢結果的記錄進行限定 2 避免select 將需要查詢的字段列出來 3 使用連線 join 來代替子查詢 4 拆分大的delete或insert語句 二 選擇合適的資料型別 1 使用可存下資料的最小的資料型別,整型 date,time char,varcha...

mysql 隨機優化 mysql 優化

mysql優化包括兩方面,一方面是sql優化,另一方面是資料庫配置優化 一 sql優化 1.優化資料型別 盡量將字段設定為 not null,如果你要儲存null,手動去設定它,而不是把它設為預設值 盡量可能的使用更小的字段,但也不要太過執著減小資料型別,要為以後的程式拓展預留一定的空間 盡量少用v...

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...