首页
网站导航
关于
Search
1
解决Typecho Joe主题访问fastly.jsdelivr.net速度慢的方案 | 快速优化技巧
2,191 阅读
2
解决WSL2内存不释放问题的最佳指南
1,406 阅读
3
如何在 Typecho Joe 主题的文章中增加目录
1,171 阅读
4
GO语言环境的搭建教程 - 完全指南
1,005 阅读
5
如何解决Win11电脑桌面上方显示横线问题 | 窗口11教程
1,005 阅读
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
登录
Search
标签搜索
重要
go基础
git 命令
go包
phpstorm
sublime
thinkphp6
mysql问题
软件分享
redis命令
php基础
thinkphp3.2
php第三扩展包
小蚯蚓博客
累计撰写
333
篇文章
累计收到
48
条评论
首页
栏目
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
页面
网站导航
关于
搜索到
35
篇与
的结果
2024-01-20
MySQL Interval 用法详解 | MySQL 时间区间使用指南
interval 作为函数时 当 interval 作为一个函数时,它被当做一个比较函数,即 interval (),如 interval (4,0,1,2,3,4,5,6),则在函数中,第一个数 4 作为被比较数,后面的 0,1,2,3,4,5,6 为比较数,然后将后面的数字依次与 4 进行比较,返回小于等于 4 的个数,所以上述结果为 5,注意,只有将 4 后面的数字从小到大进行排列,interval 函数才能正常使用,若排序混乱,可以使用,但会影响最终结果。 interval 作为关键字时 当 interval 作为一个关键字时,表示为时间间隔,常用在 date_add ()、date_sub ()函数中,常用于时间的加减法。 时间的加法 使用 date_add 函数时 mysql> select date_add('2020-07-20', interval +1 day); +-----------------------------------------+ | date_add('2020-07-20', interval +1 day) | +-----------------------------------------+ | 2020-07-21 | +-----------------------------------------+ 1 row in set (0.01 sec) mysql> select date_add('2020-07-20', interval +1 hour); +------------------------------------------+ | date_add('2020-07-20', interval +1 hour) | +------------------------------------------+ | 2020-07-20 01:00:00 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_add('2020-07-20', interval +1 minute); +--------------------------------------------+ | date_add('2020-07-20', interval +1 minute) | +--------------------------------------------+ | 2020-07-20 00:01:00 | +--------------------------------------------+ 1 row in set (0.00 sec) 使用 DATE 关键字时,需要确定时间的粒度大小,再进行具体时刻的选取,可供选择的时间粒度如下 MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH 使用如下 mysql> select DATE '2020-07-20' + interval '1 31' hour_second; +-------------------------------------------------+ | DATE '2020-07-20' + interval '1 31' hour_second | +-------------------------------------------------+ | 2020-07-20 00:01:31 | +-------------------------------------------------+ 1 row in set (0.00 sec) mysql> select DATE '2020-07-20' + interval '2' microsecond; +----------------------------------------------+ | DATE '2020-07-20' + interval '2' microsecond | +----------------------------------------------+ | 2020-07-20 00:00:00.000002 | +----------------------------------------------+ 1 row in set (0.00 sec) 时间的减法 与时间的加法使用方式一致,将 + 号换成 - 号就可以 mysql> select date_add('2020-07-20', interval -1 day); +-----------------------------------------+ | date_add('2020-07-20', interval -1 day) | +-----------------------------------------+ | 2020-07-19 | +-----------------------------------------+ 1 row in set (0.00 sec) mysql> select date_add('2020-07-20', interval -1 hour); +------------------------------------------+ | date_add('2020-07-20', interval -1 hour) | +------------------------------------------+ | 2020-07-19 23:00:00 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_add('2020-07-20', interval -1 minute); +--------------------------------------------+ | date_add('2020-07-20', interval -1 minute) | +--------------------------------------------+ | 2020-07-19 23:59:00 | +--------------------------------------------+ 1 row in set (0.00 sec) ----------------- mysql> select DATE '2020-07-20' - interval '1 31' hour_second; +-------------------------------------------------+ | DATE '2020-07-20' - interval '1 31' hour_second | +-------------------------------------------------+ | 2020-07-19 23:58:29 | +-------------------------------------------------+ 1 row in set (0.00 sec) mysql> select DATE '2020-07-20' - interval '2' microsecond; +----------------------------------------------+ | DATE '2020-07-20' - interval '2' microsecond | +----------------------------------------------+ | 2020-07-19 23:59:59.999998 | +----------------------------------------------+ 1 row in set (0.00 sec)
2024年01月20日
91 阅读
0 评论
0 点赞
2023-12-15
如何在MySQL中同时搜索多个字段 - 专业指南
MySQL如何同时搜索多个字段? MySQL是一种开源的关系型数据库管理系统,广泛应用于各种数据存储场景。在实际使用中,我们经常需要对多个字段进行搜索,以找到符合条件的数据。本文将介绍如何在MySQL中同时搜索多个字段。 使用OR操作符 OR操作符用于连接多个条件,只要其中一个条件成立,就返回结果。在搜索多个字段时,我们可以使用OR操作符将多个字段连接起来,如下所示: ame WHERE field1 LIKE '%keyword%' OR field2 LIKE '%keyword%'; ame表中搜索field1和field2两个字段,如果它们中任何一个包含关键词keyword, 使用CONCAT函数 CONCAT函数可以将多个字段连接成一个字符串,从而实现同时搜索多个字段的目的。例如: ame WHERE CONCAT(field1, field2) LIKE '%keyword%'; ame表中将field1和field2两个字段连接成一个字符串,然后在这个字符串中搜索关键词keyword,如果找到匹配项, 使用UNION操作符 UNION操作符可以将多个SELECT语句的结果合并在一起。在搜索多个字段时,我们可以使用UNION操作符将多个SELECT语句的结果合并,如下所示: ameame WHERE field2 LIKE '%keyword%'); ame表中分别搜索field1和field2两个字段,然后将它们的结果合并在一起,去除重复项后返回相应的结果。 使用全文索引 MySQL提供了全文索引功能,可以对指定的字段建立索引,从而实现更高效的搜索。在使用全文索引时,我们可以通过MATCH AGAINST语句进行搜索,如下所示: ame WHERE MATCH (field1, field2) AGAINST ('keyword'); ame表中搜索field1和field2两个字段,使用全文索引进行匹配,如果找到匹配项, 搜索多个字段是 MySQL 中常见的操作之一。本文介绍了四种方法:使用 OR 操作符、使用 CONCAT 函数、使用 UNION 操作符和使用全文索引。在实际应用中,我们可以根据具体情况选择合适的方法,以实现更高效的搜索。
2023年12月15日
123 阅读
1 评论
0 点赞
2023-09-07
MySQL全文索引使用教程
概述 全文索引与普通的索引不是一回事,在查找上方面其效率是普通模糊(like)查询的 N 倍,是 MySQL 专门提供用作搜索引擎的。 Mysql 5.6 之前版本,只有 MyISAM 支持全文索引,5.6 之后,Innodb 和 MyISAM 均支持全文索引,另外,只有字段的数据类型为 char、varchar、text 才可以建全文索引。 5.6 之后 MySQL 自带 ngram 解析器,可以解析中日韩三国文字,如果不使用 ngram 解析器,则 MySQL 默认使用空格与符号作为分隔符(对于英文自然够用了,但对于中日韩文字就不好用了,所以才需要 ngram 解析器) 创建索引 有两种方式: 一种是带有 ngram 解析器,会自动分词 ALTER TABLE news ADD FULLTEXT idx_full_text (`content`) WITH PARSER ngram; 另外一种是不带有 ngram 解析器的,以符号和空格分词 ALTER TABLE news ADD FULLTEXT idx_full_text (`content`); 查询 全文索引有专用的查询语法:match (字段) against (关键字),例如 select * from answer where match(content) against("测试表") 为了更好的搜索效果,通常会配置最小搜索长度。 全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。 // MyISAM 全文索引的的分词 ft_min_word_len = 4; 默认值 ft_max_word_len = 84; 默认值 // InnoDB 全文索引的的分词 innodb_ft_min_token_size = 3; 默认值 innodb_ft_max_token_size = 84; 默认值 // ngram解析器令牌长度----即against()中字符串切分的最小字符长度,搜索语句的内容如果不是""起来,会被分词 ngram_token_size = 2~10 ; 默认值 通常修改最小搜索长度的值为 2,在 my.ini,的 [mysqld] 的下面追加以下内容: [mysqld] innodb_ft_min_token_size = 2 ft_min_word_len = 2 ngram_token_size = 2 查看变量值 show variables like "%ft%" 三种全文搜索模式 自然语言模式 IN NATURAL LANGUAGE MODE,默认情况下为该模式,例: -- 如果最小搜索长度ngram_token_size为1的话,则查找包含张,或三,或张三的记录;与布尔搜索模式中的‘+张三’结果相同 SELECT * FROM user WHERE MATCH(userName) AGAINST (‘张三’ ); 布尔搜索模式 有以下几个操作符: 【+】----------必须包含此字符串 【-】----------必须不包含此字符串 【""】--------双引号内作为整体不能拆词 【>】--------提高该词的相关性,查询的结果靠前 【<】--------降低该词的相关性,查询的结果靠后 【*】---------通配符,只能接在词后面 例如,查询有"美女"的又有"动人"的记录: SELECT * FROM user WHERE MATCH(userName) AGAINST ('+"美女" & +"动人"' IN BOOLEAN MODE); 查询扩展搜索 较少使用,没有细了解 多字段索引 对 title 和 body 字段建立索引 ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; 然后 selec 语句如下使用即可: SELECT id, title, body, MATCH (title,body) AGAINST ('标题' IN NATURAL LANGUAGE MODE) AS score FROM articles where MATCH (title,body) AGAINST ('标题' IN NATURAL LANGUAGE MODE) ORDER BY score DESC; 不过上面这种方式,两个字段的权重是一样,有时候希望不同字段的权重不一样,例如希望你 title 字段权重大一点,这个只需要分别对字段建立索引,然后改下排序方式即可满足,例如: SELECT id, title, body, MATCH (title) AGAINST ('标题' IN NATURAL LANGUAGE MODE) AS score_title, MATCH (body) AGAINST ('标题' IN NATURAL LANGUAGE MODE) AS score_body FROM articles where (MATCH (title) AGAINST ('标题' IN NATURAL LANGUAGE MODE) OR MATCH (body) AGAINST ('标题' IN NATURAL LANGUAGE MODE)) -- 主要是改排序方式 ORDER BY score_title DESC,score_body DESC;
2023年09月07日
295 阅读
0 评论
0 点赞
2023-02-05
掌握如何查看数据表信息的专业指南
概述 有时候,我们想要看数据有哪些表,以及它们的大小信息啥的 sql 语句 通过下面的语句即可查看 SHOW TABLE STATUS FROM db_name;
2023年02月05日
236 阅读
0 评论
0 点赞
2023-02-05
SQL Where In 查询方法解析 - 两种常见方式
单个字段的方式 这种方式很简单,如下所示 select * from activity_template where activity_type in (1,2) 多个字段组合的方式 例如两个字段 select * from activity_template where (activity_type,activity_sub_type) in ((1,19),(1,101))
2023年02月05日
220 阅读
0 评论
0 点赞
2023-02-03
解决mysql [Err] 188 - FTS Query Exceeds Result Cache Limit 错误
概述 这个错误主要与 innodb_ft_result_cache_limit 配置有关,mysql 约定最大值 2^32-1,默认值 2000000000。 可通过 sql 查询当前配置: show global variables like 'innodb_ft%'; 错误原因 由于使用 BOOLEAN 模式的关键字索引查询,关键字出现词频很较高,内部匹配结果时超过了配置缓存数量限制。 解决思路 通过适当调整 innodb_ft_result_cache_limit 配置。
2023年02月03日
278 阅读
0 评论
1 点赞
2023-02-03
解决MySQL的Out of Sort Memory错误
概述 今天发现一些 SQL 报错“ERROR 1038 (HY001): Out of sort memory, consider increasing server sort buffer size”,之前版本没有问题,google 了一下发现了这个 BUG https://bugs.mysql.com/bug.php?id=103225,官方的回复说这不是一个 BUG,是一个新特性: A potentially relevant change is that somewhere between those versions, we started sorting small blobs, such as TEXT, as addon fields instead of always doing sort-by-rowid. This is the reason why there's now more pressure on the sort buffer (but for most cases, sorts should still be faster). 原因 在 8.0 的某个版本,MySQL 将 text 字段也保存到 sort buffer 中,导致 8.0 版本需要配置比之前版本更大的 sort buffer,至于需要配置多大,官方建议至少能够容纳 15 条记录。 At minimum the sort_buffer_size value must be large enough to accommodate fifteen tuples in the sort buffer 如果不想增加 sort_buffer_size,也可以将 text 字段改为 longtext 类型,longtext 类型与之前版本一样不会保存到 sort buffer。需要注意的是,这 text 字段不一定是排序字段,要把表里所有 text 改成 long text 解决思路 调整 sort_buffer_size show variables like "sort_buffer_size" ; -- 调整到合适的值 set sort_buffer_size = 524288;
2023年02月03日
329 阅读
0 评论
0 点赞
2023-01-29
如何在Windows下安装MySQL服务 - 完全指南
mysql5.6和5.7安裝服務 mysqld.exe install mysql5.7
2023年01月29日
239 阅读
0 评论
0 点赞
2022-11-15
InnoDB 缓冲池 | 提升数据库性能的关键
innodb 为了缓存磁盘中的页,在启动的时候,申请了一片连续的内存,这片内存叫做缓冲池。然后把缓冲池中连续的内存划分成 3 段,第小段是控制块、第二小段是碎片、第三小段是缓冲页。内存空间如下所示: 控制块:在缓冲池连续内存的开头,有很多个控制块,和缓冲页一一对应,大小大概是是缓冲页的 5%左右,用于存储该缓冲页的页号、以及在 buffer pool 中的地址、是否是脏页、是否是 change _buffer 等信息,可以理解成缓冲页的索引 碎片:每一个控制块都对应一个缓冲页,那么在分配足够多的控制块和缓冲页后,剩余的那点儿空间可能不够一对控制块和缓冲页的大小,自然也就用不到了。这个用不到的内存空间就称为碎片 缓冲页:把这块连续的内存,分成了若干个页,每一页的大小和表空间的页的大小一致,都是 16kb,缓冲池中的页我们称作缓冲页。 怎么区分换缓冲页中的哪些页是空闲的,然后把磁盘的页数据存到空闲的缓冲也中呢? 在系统启动的时候,所有的缓冲页都是空闲的,这个时候我们可以它们对应的控制块地址放到一个链表中,这个链表也可以称为free 链表(或者说空闲链表)。之后,每当需要从磁盘中加载一个页到 Buffer Pool 中时,就从 free 链表中取一个控制块,然后把表空间号和页号记录到控制块里,再把数据存到该控制块所对应的缓冲页中,并且把该控制块从链表中移除掉就好了。 那再次查询的时候,如何判断缓冲页中已经有该数据了呢? 由于把数据存储缓冲页的时候,已经把表空间号和页号记录到控制块,所以我们可以把为表空间号和页号作为 key,缓冲页控制块的地址作为值来创建一个哈希表。所以如果 key 存在的话,就可以根据控制块取出缓冲页的值。 什么是 change buffer? 如果是写数据,也是先从 buffer pool 里找,如果找到了就直接写,就变成了脏页,如果写是时候,在 buffer pool 没有找到,就会把写的数据记录在 change buffer 里,先不去查找 io,然后如果下一次要读这个数据时候,会到磁盘 io,然后和 change buffer 里的这个数据合并起来。 什么是脏页? 当我们修改了缓冲页中的数据,它就和磁盘中的不一致了,这样的缓冲页我们叫做脏页。 因为我们不能立即对脏页数据刷盘,那么之后要刷盘的时候,怎么知道哪些是脏页? mysql 创建一个存储脏页的链表,凡事被修改过的缓冲页的控制块地址都会被放到这个链表中,因为这个链表节点对应的缓冲页都是需要被刷新到磁盘上的,所以也称为 flush 链表 。 因为红冲池的大小是固定的,如果大小不够的时候,该淘汰哪些红冲页的数据呢? Buffer Pool 中不再有空闲的缓冲页时,就需要淘汰掉最近很少使用的部分缓冲页。我们可以创建一个 LRU 链表,当使用到某个页的时候,就把该页的控制块地址放到链表头部,如果需要淘汰的时候,只需要把链表尾部的缓冲页给淘汰掉就好了。同时,还需要将 lru 链表分为热数据和冷数据两个区,防止以下两种情况: mysql 的预读,可能读取到数据没有用,却放到了 lru 链表的头部,所以优化后要放到 old 区的头部 全表扫描,扫到的数据很多,把热数据从 lru 链表中挤到后面,被淘汰了,所以优化后要放到 old 区的头部 当然 lru 链表还有一些细节优化,这里没必要研究的太深。 其它链表? mysql 主要是通过链表来管理终端的缓冲页,还有其它很多缓冲页,这里不赘述了。 如何刷新脏页到磁盘的呢? mysql 中有一个后台线程,定时的去执行以下两个步骤: 从 LRU 链表的冷数据中刷新一部分页面到磁盘,可以从冷数据的控制块信息上查看是否是脏数据,是的话就刷盘 从 flush 链表中刷新一部分页面到磁盘,当然,如果要缓冲数据的时候,缓冲页中都是脏数据,那么用户线程就会将脏数据刷盘,这个尽量要避免。
2022年11月15日
290 阅读
0 评论
0 点赞
2022-10-23
MySQL分组获取最大记录教程 | 如何选择每组的最大记录
介绍 默认情况,分组后取的是第一条数据,有时候我们希望取最后一条数据 方法 max函数 分组的时候使用max函数获取最大的id,然后再in这个id获取记录。. select * from erp_user_money where id IN (select max(id) from erp_user_money where 1 group by user_id); 或者 select * from erp_user_money a where id = (select max(id) from erp_user_money b where a.user_id = b.user_id); 使用not exists 这个方法速度比较块 select * from erp_user_money a where not exist (select 1 from erp_user_money b where a.user_id = b.user_id and a.id < b.id);
2022年10月23日
256 阅读
0 评论
0 点赞
1
2
...
4