mysql中那些冷门确很有用的知识

前言

在使用mysql过程中发现了一些非常有用的内置函数,今天拿出来分享到大家,希望对你会有所帮助。

1. group_concat

平时使用mysql的时候使用group by 分组的场景还是比较多的。
比如想统计具体用户名称有哪些

mysql> select name from user group by name;
+-----------+
| name      |
+-----------+
| 张三    |
| 111胡桃 |
| 1胡桃11 |
| 11胡桃1 |
| 胡桃111 |
| 胡桃    |
| 甘雨    |
| 钟离    |
| 刻晴    |
| 七七    |
+-----------+

如果我们想让相同用户的地区拼接在一起的话就可以使用group_concat

mysql> select name, group_concat(area) from user group by name;

+-----------+-----------------------------+
| name      | group_concat(area)          |
+-----------+-----------------------------+
| 111胡桃 | 重庆                      |
| 11胡桃1 | 北京                      |
| 1胡桃11 | 成都                      |
| 七七    | 成都,北京,上海,重庆 |
| 刻晴    | 成都,重庆,上海,北京 |
| 张三    | 成都                      |
| 甘雨    | 重庆,上海,北京,成都 |
| 胡桃    | 北京,上海,重庆        |
| 胡桃111 | 上海                      |
| 钟离    | 重庆,上海,北京        |
+-----------+-----------------------------+

使用group_concat函数,可以轻松的把分组后,name相同的数据拼接到一起,组成一个字符串,用逗号分隔。
当然group_concat函数还有一些很巧妙的用法,比如我们现在想通过用户名分组,然后找到其中年龄最大的那个用户就可以这样做。

mysql> SELECT SUBSTRING_INDEX(group_concat(id ORDER BY `age` DESC), ',', 1) as id FROM `user` GROUP BY `name`;
+----+
| id |
+----+
| 2  |
| 4  |
| 3  |
| 21 |
| 22 |
| 1  |
| 11 |
| 7  |
| 5  |
| 10 |
+----+

通过group_concat我们指定id按照age倒序拼接,然后使用SUBSTRING_INDEX截取,分割后的第一个元素那么这个元素就是年龄最大的id。之后就可以通过子查询查询该用户的所有信息了。

2. replace

实际开发中经常会有替换字符串中部分内容的需求,比如:将字符串中的字符A替换成B。这种情况就可以使用replace函数。

update `user` set `name`=replace(`name`,' ','') where `name` like ' %';
update `user` set `name`=replace(`name`,' ','') where `name` like '% ';

这样就能轻松实现字符串替换。

3. char_length

有时候我们需要获取字符的长度,然后根据字符的长度进行排序。
这时就可以使用char_length
通过该函数就能获取字符长度。
获取字符长度并且排序的sql如下:

select * from `user` where `name` like '%胡桃%' order by char_length(`name`) desc limit 3;
+----+-----------+-----+--------+------------+
| id | name      | age | area   | birthday   |
+----+-----------+-----+--------+------------+
|  2 | 111胡桃 |  32 | 重庆 | 1990-10-29 |
|  3 | 1胡桃11 |  44 | 成都 | 1978-05-22 |
|  4 | 11胡桃1 |  10 | 北京 | 2011-12-30 |
+----+-----------+-----+--------+------------+

4. locate

有时候我们在查找某个关键字,比如:胡桃,并且需要明确知道它在某个字符串中的位置时,就能使用locate

select * from `user` where `name` like '%胡桃%' order by char_length(`name`) asc , locate('胡桃',`name`) asc ;
+----+-----------+-----+--------+------------+
| id | name      | age | area   | birthday   |
+----+-----------+-----+--------+------------+
|  6 | 胡桃    |  28 | 重庆 | 1994-11-11 |
|  7 | 胡桃    |  32 | 上海 | 1990-03-02 |
|  8 | 胡桃    |  18 | 北京 | 2004-07-01 |
|  5 | 胡桃111 |  25 | 上海 | 2001-08-15 |
|  3 | 1胡桃11 |  44 | 成都 | 1978-05-22 |
|  4 | 11胡桃1 |  10 | 北京 | 2011-12-30 |
|  2 | 111胡桃 |  32 | 重庆 | 1990-10-29 |
+----+-----------+-----+--------+------------+

我们可以看到首先通过字符串长度排序后,相同长度的数据会根据关键字所在字符串中的位置排序,越靠左越靠前。
除此之外,我们还可以使用:instrposition函数,它们的功能跟locate函数类似。顺带一提instr等可以用来替代like查询。

select * from `user` where instr(`name`,'胡桃') > 0;
+----+-----------+-----+--------+------------+
| id | name      | age | area   | birthday   |
+----+-----------+-----+--------+------------+
|  2 | 111胡桃 |  32 | 重庆 | 1990-10-29 |
|  3 | 1胡桃11 |  44 | 成都 | 1978-05-22 |
|  4 | 11胡桃1 |  10 | 北京 | 2011-12-30 |
|  5 | 胡桃111 |  25 | 上海 | 2001-08-15 |
|  6 | 胡桃    |  28 | 重庆 | 1994-11-11 |
|  7 | 胡桃    |  32 | 上海 | 1990-03-02 |
|  8 | 胡桃    |  18 | 北京 | 2004-07-01 |
+----+-----------+-----+--------+------------+

5. explain

使用explain命令,查看mysql的执行计划,它会显示索引的使用情况。如:

explain select * from `user` where id = 2;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

可以简单通过typekeykey_len这几列判断索引使用情况,具体执行计划包含列的含义如下图所示:

QQ20221229-113605

当然sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了。
下面说说索引失效的常见原因:


QQ20221229-113720

如果不是这些原因那就需要进一步排查了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容