mysql - 我目前在 mySQL 的“视图”中收到附加警告,知道这意味着什么吗?
问题描述
错误:警告:#1292 截断不正确的 DOUBLE 值:“
我的“视图”的结构如下:
# | Name | Type
1 id1 varchar(255)
2 id2 varchar(255)
3 category1 varchar(255)
4 category2 varchar(255)
5 category3 varchar(255)
6 id2name varchar(255)
7 date1 date
8 date2 date
9 name1 varchar(255)
10 name2 varchar(255)
11 name3 varchar(255)
12 category4 varchar(255)
13 level1 int(11)
14 level2 int(11)
15 levelflex varchar(255)
16 category5 varchar(255)
17 category6 varchar(255)
18 category7 varchar(21)
SQL 代码:
SELECT
`x`.`id1` AS `id1`,
`x`.`id2` AS `id2`,
`x`.`category1` AS `category1`,
`x`.`category2` AS `category2`,
`x`.`category3` AS `category3`,
`x`.`id2name` AS `id2name`,
`x`.`date1` AS `date1`,
`x`.`date2` AS `date2`,
`x`.`name1` AS `name1`,
`x`.`name2` AS `name2`,
`x`.`name3` AS `name3`,
`x`.`category4` AS `category4`,
`x`.`level1` AS `level1`,
`x`.`level2` AS `level2`,
`x`.`levelflex` AS `levelflex`,
`x`.`category5` AS `category5`,
`x`.`category6` AS `category6`,
`x`.`category7` AS `category7`FROM
(
(
SELECT
`r`.`id1` AS `id1`,
`d`.`id2` AS `id2`,
`m`.`subcategory` AS `category1`,
`n`.`subcategory` AS `category2`,
`r`.`category3` AS `category3`,
`d`.`id2name` AS `id2name`,
`r`.`date1` AS `date1`,
`d`.`date2` AS `date2`,
`r`.`name1` AS `name1`,
`r`.`name2` AS `name2`,
`r`.`name3` AS `name3`,
`r`.`category4` AS `category4`,
`r`.`level1` AS `level1`,
`d`.`level1` AS `level2`,
`d`.`level1flex` AS `levelflex`,
`r`.`category5` AS `category5`,
`r`.`category6` AS `category6`,
CAST(
rank() over(
PARTITION BY `r`.`id1`
ORDER BY CASE WHEN
`m`.`subcategory` = `n`.`subcategory` AND `r`.`level1` = `d`.`level1` THEN 1 WHEN `m`.`subcategory` = `n`.`subcategory` AND `r`.`level1` = `d`.`levelflex` THEN 2 WHEN `m`.`subcategory` <> `n`.`subcategory` AND `r`.`level1` = `d`.`level1` THEN 3 WHEN `m`.`subcategory` <> `n`.`subcategory` AND `r`.`level1` = `d`.`levelflex` THEN 4
END,
`d`.`date2`,
`r`.`id1`
) AS CHAR CHARSET utf8mb4) AS `category7`FROM
(
(
(
(
(
(
(
(
`Server`.`table1` `d`
JOIN `Server`.`table2` `r`
ON
(
`d`.`category4` = `r`.`category4` AND(
`d`.`level1` = `r`.`level1` AND `r`.`level1` <> 12 AND `r`.`level1` <> 13 OR SUBSTRING_INDEX(`d`.`levelflex`, ',', 1) = `r`.`level1` AND `r`.`level1` <> 12 AND `r`.`level1` <> 13 OR SUBSTRING_INDEX(`d`.`levelflex`, ',', -1) = `r`.`level1` AND `r`.`level1` <> 12 AND `r`.`level1` <> 13
)
)
)
JOIN `Server`.`table3` `p`
ON
(
`d`.`id2name` = `p`.`newid2name` OR `d`.`id2name` = `p`.`oldid2name`
)
)
JOIN `Server`.`table4` `m`
ON
(
`p`.`newid2name` = `m`.`id2name` OR `p`.`oldid2name` = `m`.`id2name`
)
)
JOIN `Server`.`table5` `h`
ON
(`r`.`category3` = `h`.`category3`)
)
JOIN `Server`.`table6` `f`
ON
(`r`.`id1` = `f`.`id1`)
)
LEFT JOIN `Server`.`table7` `e`
ON
(`f`.`id1` = `e`.`id1`)
)
JOIN `Server`.`table8` `n`
ON
(
(
`r`.`date1` >= `h`.`subdate1` AND `e`.`subdate1` = `h`.`subdate1` OR `f`.`subdate2` = `h`.`subdate1` AND `r`.`date1` < `h`.`subdate1`
) AND `h`.`id2name` = `n`.`id2name`
)
)
LEFT JOIN `Server`.`table9` `z`
ON
(
`d`.`id2` = `z`.`id2` AND `r`.`id1` = `z`.`id1`
)
)
WHERE
`z`.`id2` IS NULL
) `x`LEFT JOIN `Server`.`table10` `y`ON
(
`x`.`id2` = `y`.`id2` AND `x`.`id1` = `y`.`id1`
)
)WHERE
`y`.`id2` IS NULL
对于总共 44 行,该查询也需要大约 15 秒或更长时间。有没有办法优化这个?
我也在尝试将数据从视图传输到表。对此有什么建议吗?
显示创建表:
看法 | 创建视图 | character_set_client | collation_connection |
---|---|---|---|
样品视图 | CREATE ALGORITHM=UNDEFINED DEFINER= dbadmin @ % SQL SECURITY DEFINER VIEW sampleview AS select x 。作为,id1 .`r ...id1 x |
utf8mb4 | utfmb4_unicode_ci |
解释选择...:
ID | 选择类型 | 桌子 | 类型 | 可能的键 | 钥匙 | key_len | 参考 | 行 | 额外的 |
---|---|---|---|---|---|---|---|---|---|
1 | 基本的 | 衍生2 | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 251497948917600 | |
1 | 基本的 | 是的 | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 1 | 使用哪里;使用连接缓冲区(平面,BNL 连接) |
2 | 衍生的 | d | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 106 | 使用临时 |
2 | 衍生的 | F | 全部 | 基本的 | 无效的 | 无效的 | 无效的 | 115 | 使用连接缓冲区(平面,BNL 连接) |
2 | 衍生的 | e | eq_ref | 基本的 | 基本的 | 767 | 服务器.f.id1 | 1 | |
2 | 衍生的 | r | eq_ref | 基本的 | 基本的 | 767 | 服务器.f.id1 | 1 | 使用哪里 |
2 | 衍生的 | z | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 1 | 使用哪里;使用连接缓冲区(平面,BNL 连接) |
2 | 衍生的 | p | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 140 | 使用哪里;使用连接缓冲区(增量,BNL 连接) |
2 | 衍生的 | 米 | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 198 | 使用哪里;使用连接缓冲区(增量,BNL 连接) |
2 | 衍生的 | n | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 198 | 使用连接缓冲区(平面,BNL 连接) |
2 | 衍生的 | H | 全部 | 无效的 | 无效的 | 无效的 | 无效的 | 3759 | 使用哪里;使用连接缓冲区(增量,BNL 连接) |
解决方案
有 251万亿行,我怀疑该查询包含意外的“交叉连接”。检查所有JOIN
两者中的VIEW
和使用中的VIEW
。
AND
另外,请注意和之间的优先规则OR
。
OR
通常是性能杀手。
(同时,我没有看到关于错误 1292 的任何线索。)
其中一些复合索引可能会有所帮助:
y: INDEX(id2, id1)
r: INDEX(category4)
d: INDEX(category4)
m: INDEX(id2name, subcategory)
n: INDEX(id2name, subcategory)
p: INDEX(newid2name, oldid2name)
h: INDEX(category3, subdate1, id2name)
f: INDEX(id1, subdate2)
e: INDEX(id1, subdate1)
z: INDEX(id2, id1)
部分性能优势在于它们中的大多数都是“覆盖”的。如需进一步讨论,请提供SHOW CREATE TABLE
基础表格和EXPLAIN SELECT...
推荐阅读
- angular - angular - ag-grid 将日期选择器添加到日期单元格以进行编辑
- redis - 是否可以在 Redis 上同步主节点
- python - 为什么我在使用 Pickle 和 Socket 库 Python 时出现 Unpickling 错误
- sql - 表模式和名称的正则表达式验证
- python - sam deploy 失败并出现错误存储桶位于此区域:us-east-2。请将此区域用于 us-east-2
- python - 'builtin_function_or_method' 对象没有属性 'apply' cv2
- c++ - 用C++从一个段落中找到一个句子中的最大单词数
- rest - 使用 Bitrix 24 REST API 将 CRM 项目链接到日历事件
- angular - Highcharts:在 X/Y 轴末端添加箭头
- reactjs - React js路由未显示组件