MySQL模糊查询like和ilike的区别?
LIKE 和 ILIKE 操作符可以模糊匹配字符串,LIKE是一般用法,ILIKE匹配时则不区分字符串的大小写,~ 波浪号则可以使用正则匹配。
LIKE和 ILIKE
它们需要结合通配符使用,下面介绍两种常用的通配符。
%:百分号用于匹配字符串序列,可匹配任意组合;
_:下划线用于匹配任何单一字符。
则可以使用正则模式来匹配字符串,除此之外它匹配模式还有一个特殊的地方
select * from table where ~ 'ab'; --> 如果是这样的形式就代表着他可以匹配任何包含ab的字符串其实就相当于省略的两边的 .*
如果想要做前缀匹配或后缀匹配,可以用下面的方法
1、前缀+模糊查询。
select * from table where ~ '^ab';
2、后缀+模糊查询。
select * from table where ~ 'ab$';
mysql模糊查询显示某一字段太长?
1、一般查询语句:SELECT `lcontent` FROM `caiji_ym_liuyan`
查询数据:
2、有些时候需要查询某个字段的长度为多少时候才显示数据:
SQL语句:SELECT `lcontent` FROM `caiji_ym_liuyan` where
length(lcontent)<=40
PS:在mysql中一个汉字等于3个字节,所以查询的时候需要转换一下
特别要注意的就时候对于字节的转换
mysql的like为什么会导致索引失效?
MySQL的LIKE操作符可以用于模糊匹配数据行中的某些文本或字符。然而,当使用LIKE语句时,如果搜索字符串的开头是通配符(如%),MySQL就无法使用索引来加速查询,因为它需要扫描整个表来查找匹配项。
这种情况下,MySQL优化器会选择进行全表扫描,因为它无法确定哪些索引列是需要使用的,因此会忽略所有的索引,从而导致索引失效。
例如,假设有一个包含“name”和“age”两列的表,其中“name”列采用了索引,现在需要查询名字开头为“Tom”的记录,SQL语句可能如下:
复制代码
SELECT * FROM users WHERE name LIKE 'Tom%';
由于LIKE语句中的“%”通配符出现在搜索字符串的开头,MySQL无法使用索引来加速查询,只能对整个表进行扫描,查询效率会大大降低。
为了避免这种情况,可以尝试将LIKE语句中的通配符放在搜索字符串的末尾,这样MySQL可以利用索引来快速定位匹配项,例如:
复制代码
SELECT * FROM users WHERE name LIKE '%Tom';
总之,当使用LIKE语句时要注意通配符的位置,如果出现在搜索字符串的开头,可能会导致MySQL无法使用索引来加速查询,从而导致索引失效。
如何通过优化sql语句提高数据库查询效率?
通过优化SQL语句,提高数据库查询效率,我总结了有这么几个方面:
减少数据访问
看起来像一句废话,少访问数据当然可以提高速度了,减少数据访问有这么几个方法:
创建并正确使用索引
我们经常用到的就是B-TREE索引,我们经常说到的【索引】也指的是【B-TREE索引】。
正确使用索引可以让查询效率翻倍,但是如果使用不正确,也会对效率降低很多,比如这几种情况就会造成索引失效:
不等于操作:<>? 、not in('')
进行了运算后的字段:column+1(简单的运算),function(column)(函数)
含前导模糊查询:like '%xxx'
IS NULL
隐式类型转换:column是char类型,但是写成column = 123(右边是另外一种类型)
只通过索引访问数据
有些时候,我们只需要访问表中的某几个列的数据,我们可以为这几个字段建立一个组合索引,这样的话只通过索引就可以得到数据,可以较小IO的开销。比如:
select name,gender from users where age='25';
如果这个SQL用的频率很高,那么我们可以建立一个组合索引:
create index index_xxx on users(name,gender,age);
在执行这个sql的时候,数据全部都是通过索引找到的,都不需要访问users表。
优化SQL执行计划
执行计划表示SQL在执行时候的算法,有的时候SQL语句很复杂,就需要优化SQL的执行计划去提高SQL的执行效率。
其他
可能不和SQL有直接的关系,但确实效率提升很明显,比如:
- 数据分页处理
- 只返回需要的字段
- 减少交互次数(batch DML)
- 使用绑定变量(可以减少数据库服务器CPU运算)
但是要注意,对SQL不要过度优化,满足需求即可。
希望我的回答能够帮助到你!