小编Ric*_*mes的帖子

在 MySQL 中,以块为单位查询整个表的最有效方法是什么?

如果我有一张桌子User,做这样的事情会更快:

SELECT * FROM user WHERE id > ? ORDER BY id LIMIT 10000

(每个后续查询都使用前最后一行的 id 作为参数)

或者使用带有偏移量的 LIMIT,如下所示:

SELECT * FROM user ORDER BY id LIMIT ?, 10000

(到目前为止检索到的记录总数是偏移量)。

作为一个额外的复杂因素,如果我想基于链接表连接执行类似的查询怎么办?就像说一个user可以属于多个角色,所以我想要一个查询

SELECT u.* FROM user u INNER JOIN user_roles ur ON ur.user_id = u.id WHERE ur.role_name IN ('Admin', 'SuperUser', 'etc.') LIMIT ?, 10000

连接是否会影响关于首选哪种样式查询的决定?

mysql performance limits paging

2
推荐指数
1
解决办法
3439
查看次数

在慢日志表 sql_text 列是 BLOB

我们启用了 slow_log 来调试慢查询。但是在slow_log 表中,sql_text 列是BLOB ..它以前在5.6 上运行良好,但现在在5.7 上显示blob

(澄清) 将slowlog 保存到a 时TABLE,无法安全存储在某些标准列中的BLOBsTEXT字符串会发生什么情况?显然,TEXT值存储在BLOB. 在这种情况下,我如何取回TEXT所需的CHARACTER SET

mysql mysql-5.6 mysql-5.7

2
推荐指数
1
解决办法
3531
查看次数

选择一组项目的第一个实例

我正在尝试修改从一组客户中提取最新订单并提供 order_type 的现有查询。

当前查询工作正常(虽然有点慢,但下面的所有列都已编入索引):

SELECT 
    DISTINCT(td1.product_id), 
    td1.customer_id, 
    td1.date_test_added,
    tdmi.product_type_id
FROM 
    order_history AS td1
    LEFT JOIN order_history td2     
    ON td1.customer_id = td2.customer_id AND td1.date_test_added < td2.date_test_added
    LEFT JOIN order_types tdmi      
    ON tdmi.product_id   = td1.product_id 
WHERE
   td2.date_test_added IS NULL
   AND tdmi.product_type_id = 31
   AND td1.customer_id IN (91000, 91001, 91002, 91003)
Run Code Online (Sandbox Code Playgroud)

如果我将第一个连接中的小于运算符更改为大于,则不会返回任何结果。

更改此设置以提取最早订单(基于 date_test_ added)的最佳方法是什么?

mysql select greatest-n-per-group

2
推荐指数
1
解决办法
2190
查看次数

删除所有特殊字符而不删除重音字符

我需要清理字符串数据中包含所有类型奇怪字符的列。奇怪的字符几乎就是这些 []!@#$%.&*`~^-_{}:;<>/\|()

我只需要允许 [0-9]、[az],但由于包含一些西班牙语单词,所以还需要允许重音字符。

我一直在查看https://dev.mysql.com/doc/refman/8.0/en/regexp.html尝试设计一个可能适合此的正则表达式,但我的正则表达式 foo 很弱。

是否有办法清理这些字符,而不必单独查找和替换特殊字符,同时仍保留重音字符?

mysql

2
推荐指数
1
解决办法
2万
查看次数

如何将最后一次和第一次出现的项目放入单独的列中?

我确实有一张休闲表:

id name     value
1  Daniel   3
2  Daniel   7
3  Daniel   2
4  Carol    9
5  Carol    4
6  Carol    9
7  Ray      5
8  Charles  1
Run Code Online (Sandbox Code Playgroud)

我想在如下表中获取第一个和最后一个值(按 排序id):

name    value_1st  value_last
Daniel  3         2
Carol   9         9  
Ray     5         NULL
Charles 1         NULL
Run Code Online (Sandbox Code Playgroud)

如何编写查询以获取按名称分组并按 id 排序的最后一次和第一次出现的值,像这样?

mysql query greatest-n-per-group

2
推荐指数
1
解决办法
3735
查看次数

如果使用日期函数,则在 MySQL 中索引日期列不起作用

我有一个具有以下架构的表

table_name

id int
task_id int
completed_date datetime (INDEX IX_TBL_NAME_COMPLETED_DATE)
Run Code Online (Sandbox Code Playgroud)

我在这个查询上运行 EXPLAIN

EXPLAIN 
    SELECT
        *
    FROM table_name TBL
    WHERE
        TBL.completed_date BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)

此查询使用已完成日期的索引运行并获取记录

但是,在使用日期函数运行相同的查询时

EXPLAIN 
    SELECT
        *
    FROM table_name TBL
    WHERE
        CONVERT_TZ(TBL.completed_date, timezone1, timezone2) BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)

未使用索引导致查询变慢。

有人可以解释这种行为背后的原因以及优化此类查询的解决方案吗?

mysql optimization index-tuning datetime mysql-5.7

2
推荐指数
1
解决办法
157
查看次数

提高大表中MySql查询性能

我有一个 MySql 数据库,用于存储来自应用程序的事件,自从我们创建它以来,我们只插入和选择数据,我们从未删除任何行。我不是数据库管理员,我的组织中没有数据库管理员,所以如果我遗漏了一些基本的东西,请多多包涵。数据库有一个像这样的表:

CREATE TABLE `eventlogs` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `LogType` int(11) NOT NULL,
  `ProductId` longtext,
  `Username` varchar(128) CHARACTER SET utf8 DEFAULT NULL,
  `ClientVersion` longtext,
  `Message` longtext,
  `Referrer` longtext,
  `UserAgent` longtext,
  `CreatedDate` datetime NOT NULL,
  PRIMARY KEY (`Id`),
  KEY `IX_LogType` (`LogType`),
  KEY `IX_CreatedDate` (`CreatedDate`),
  KEY `IX_Username` (`Username`)
) ENGINE=InnoDB AUTO_INCREMENT=180712975 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

这曾经非常有效,但它达到了几乎不可能运行任何查询的程度,它们需要超过 15 分钟,有时甚至更多!这是我们运行的典型查询:

SELECT * FROM customily_logs.eventlogs
    WHERE CreatedDate > '2020-06-01'
      and Username = 'myuser'
      and LogType = 3
Run Code Online (Sandbox Code Playgroud)

这是查询的执行计划:

{
  "query_block": {
    "select_id": 1,
    "cost_info": …
Run Code Online (Sandbox Code Playgroud)

mysql innodb mysql-5.7 query-performance

2
推荐指数
1
解决办法
70
查看次数

MySQL 查询失败:SELECT 列表的表达式 #6 不在 GROUP BY 子句中并且包含非聚合列修复错误每次重新启动都会重新出现

MySQL Query Failed: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 
Run Code Online (Sandbox Code Playgroud)

使用以下查询修复了此错误。通过以 root 用户身份登录 MySQL 控制台

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

但问题是每次我重新启动系统时这个错误都会重新出现。如何解决这个问题?

mysql php greatest-n-per-group

1
推荐指数
1
解决办法
1527
查看次数

MySQL中的“弃用”是指“不保证”还是“仍然保证”?

MySQL 3.23/4.0/4.1 和 5.1 状态:

如果您使用GROUP BY [ for select],则输出行将根据列进行排序,GROUP BY就像您ORDER BY对相同的列使用an一样。???

但是,MySQL 5.5 声明:

GROUP BY在 MySQL 5.5 中依赖隐式排序弃用。要实现分组结果的特定排序顺序,最好使用显式ORDER BY子句。???

(以上信息也在 5.65.7 中说明。)

MySQL 中的“已弃用”究竟是什么意思?

隐式的行为是否group by仍然保证在 MySQL 5.5、5.6 和 5.7(当前最新版本)上工作,就像之前的每个版本一样?

是否ORDER BY NULL仍然需要从做不必要的排序停止MySQL的?

编辑(由里克詹姆斯)

这包括数据库问题:

  • 的排序GROUP BY,而不ORDER BY
  • 的意义和用处 ORDER BY NULL
  • 使用“已弃用”“功能”的智慧
  • MySQL手册中“deprecated”的含义(不仅仅针对这种情况)

mysql

-5
推荐指数
2
解决办法
1178
查看次数