如果我有一张桌子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
连接是否会影响关于首选哪种样式查询的决定?
我们启用了 slow_log 来调试慢查询。但是在slow_log 表中,sql_text 列是BLOB ..它以前在5.6 上运行良好,但现在在5.7 上显示blob
(澄清) 将slowlog 保存到a 时TABLE,无法安全存储在某些标准列中的BLOBs和TEXT字符串会发生什么情况?显然,TEXT值存储在BLOB. 在这种情况下,我如何取回TEXT所需的CHARACTER SET?
我正在尝试修改从一组客户中提取最新订单并提供 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)的最佳方法是什么?
我需要清理字符串数据中包含所有类型奇怪字符的列。奇怪的字符几乎就是这些 []!@#$%.&*`~^-_{}:;<>/\|()
我只需要允许 [0-9]、[az],但由于包含一些西班牙语单词,所以还需要允许重音字符。
我一直在查看https://dev.mysql.com/doc/refman/8.0/en/regexp.html尝试设计一个可能适合此的正则表达式,但我的正则表达式 foo 很弱。
是否有办法清理这些字符,而不必单独查找和替换特殊字符,同时仍保留重音字符?
我确实有一张休闲表:
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 排序的最后一次和第一次出现的值,像这样?
我有一个具有以下架构的表
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 数据库,用于存储来自应用程序的事件,自从我们创建它以来,我们只插入和选择数据,我们从未删除任何行。我不是数据库管理员,我的组织中没有数据库管理员,所以如果我遗漏了一些基本的东西,请多多包涵。数据库有一个像这样的表:
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 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 3.23/4.0/4.1 和 5.1 状态:
如果您使用
GROUP BY[ forselect],则输出行将根据列进行排序,GROUP BY就像您ORDER BY对相同的列使用an一样。???
但是,MySQL 5.5 声明:
GROUP BY在 MySQL 5.5 中依赖隐式排序已被弃用。要实现分组结果的特定排序顺序,最好使用显式ORDER BY子句。???
MySQL 中的“已弃用”究竟是什么意思?
隐式的行为是否group by仍然保证在 MySQL 5.5、5.6 和 5.7(当前最新版本)上工作,就像之前的每个版本一样?
是否ORDER BY NULL仍然需要从做不必要的排序停止MySQL的?
编辑(由里克詹姆斯)
这包括数据库问题:
GROUP BY,而不ORDER BYORDER BY NULLmysql ×9
mysql-5.7 ×3
datetime ×1
index-tuning ×1
innodb ×1
limits ×1
mysql-5.6 ×1
optimization ×1
paging ×1
performance ×1
php ×1
query ×1
select ×1