MySQL比like语句更高效的写法

https://blog.csdn.net/wpfphp/article/details/52584232

https://blog.csdn.net/shellching/article/details/8098120 

instr语法 

语法如下:
  instr( string1, string2, start_position,nth_appearance ) [1]  [2] 

string1

源字符串,要在此字符串中查找。

string2

要在string1中查找的字符串 。

start_position

代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。

nth_appearance

代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。

注意一点,locate语句后面设置<0, >0 , =0的区别:


mysql> select*from `runoob_tbl`;
+-----------+--------------+------------------+-----------------+
| runoob_id | runoob_title | runoob_author    | submission_date |
+-----------+--------------+------------------+-----------------+
|         1 | 学习 PHP     | 爆炸菜鸟教程爆炸 | 2018-08-15      |
|         2 | 学习 MySQL   | 菜鸟教程         | 2018-08-15      |
|         3 | 学习 C++     | RUNOOB.COM       | 2016-05-06      |
|         4 | JAVA 教程    | RUNOOB.COM       | 2016-03-06      |
|         5 | 连接         | 随便写           | 2018-08-18      |
+-----------+--------------+------------------+-----------------+
 
 
mysql> select*from `runoob_tbl` where locate('教程',`runoob_author`)>0;
+-----------+--------------+------------------+-----------------+
| runoob_id | runoob_title | runoob_author    | submission_date |
+-----------+--------------+------------------+-----------------+
|         1 | 学习 PHP     | 爆炸菜鸟教程爆炸 | 2018-08-15      |
|         2 | 学习 MySQL   | 菜鸟教程         | 2018-08-15      |
+-----------+--------------+------------------+-----------------+
2 rows in set
mysql> select*from `runoob_tbl` where locate('教程',`runoob_author`)<0;
Empty set
mysql> select*from `runoob_tbl` where locate('教程',`runoob_author`)=0;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         3 | 学习 C++     | RUNOOB.COM    | 2016-05-06      |
|         4 | JAVA 教程    | RUNOOB.COM    | 2016-03-06      |
|         5 | 连接         | 随便写        | 2018-08-18      |
+-----------+--------------+---------------+-----------------+
3 rows in set
  • 语句结构:
  • LOCATE(substr,str) , LOCATE(substr,str,pos
  • FIND_IN_SET(substr,strlist)

like是广泛的模糊匹配,字符串中没有分隔符,find_in_set是精确匹配,字段值以英文”,”分隔, 注意 find_in_set 是全表扫描的

例:

mysql> select*from `runoob_tbl`;
+-----------+--------------+------------------+-----------------+
| runoob_id | runoob_title | runoob_author    | submission_date |
+-----------+--------------+------------------+-----------------+
|         1 | 学习 PHP     | 爆炸菜鸟教程爆炸 | 2018-08-15      |
|         2 | 学习 MySQL   | 菜鸟教程         | 2018-08-15      |
|         3 | 学习 C++     | RUNOOB.COM       | 2016-05-06      |
|         4 | JAVA 教程    | RUNOOB.COM       | 2016-03-06      |
|         5 | 连接         | 随便写           | 2018-08-18      |
+-----------+--------------+------------------+-----------------+
5 rows in set
 
mysql> select*from `runoob_tbl` where find_in_set('菜鸟教程',`runoob_author`);
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | 学习 MySQL   | 菜鸟教程      | 2018-08-15      |
+-----------+--------------+---------------+-----------------+
1 row in set
#find_in_set后跟完整的字符串'菜鸟教程'可选出结果。
 
否则,结果为空:
mysql> select*from `runoob_tbl` where find_in_set('教程',`runoob_author`)>0;
Empty set
 
 
若设置find_in_set=0,则选出的结果为不包含'菜鸟教程'的内容:
 
mysql> select*from `runoob_tbl` where find_in_set('菜鸟教程',`runoob_author`)=0;
+-----------+--------------+------------------+-----------------+
| runoob_id | runoob_title | runoob_author    | submission_date |
+-----------+--------------+------------------+-----------------+
|         1 | 学习 PHP     | 爆炸菜鸟教程爆炸 | 2018-08-15      |
|         3 | 学习 C++     | RUNOOB.COM       | 2016-05-06      |
|         4 | JAVA 教程    | RUNOOB.COM       | 2016-03-06      |
|         5 | 连接         | 随便写           | 2018-08-18      |
+-----------+--------------+------------------+-----------------+
4 rows in set
  • INSTR(str,substr)
  • POSITION(substr IN str)   其中substr为需要查找的字符串,str及strlist为查找范围。

关于大小写敏感问题:https://blog.csdn.net/qq_27682041/article/details/73647706

根据引用\[2\]中的描述,问题出现在执行计划中的第6行IndexRangeScan_30中,like算子做范围查询的范围选择了\["dir", "dis"\],而实际上应该选择\["dir_abc4999/", "dir_abc49990"\]。这导致了查询的行数达到了2亿+条,从而导致了查询速度变慢。 针对这个问题,可以考虑对sql语句进行优化。根据引用\[3\]中的描述,可以使用POSITION函数来替代LIKE操作符,以提高查询性能。具体的优化步骤如下: 1. 将原来的LIKE操作符替换为POSITION函数,例如将name >= 'dir'替换为POSITION('dir' IN name) > 0。 2. 将原来的name < 'dis'替换为POSITION('dis' IN name) = 0。 3. 将原来的查询条件改为使用POSITION函数,例如将WHERE bucket_id = '.bucket.meta.cmu-bucket01' and name >= 'dir' and name < 'dis'改为WHERE bucket_id = '.bucket.meta.cmu-bucket01' and POSITION('dir' IN name) > 0 and POSITION('dis' IN name) = 0。 通过使用POSITION函数,可以精确地指定范围查询的条件,避免了引用\[2\]中描述的问题,从而提高了查询性能。 #### 引用[.reference_title] - *1* *2* [一条 like 条件的慢 SQL 语句优化](https://blog.csdn.net/TiDBer/article/details/126523367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysqlMysql模糊查询like效率,以及高效写法和sql优化方法](https://blog.csdn.net/forest_fire/article/details/119209671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值