优化技能分享
SQL如下:
选择
p_item_token *,
p_item.product_type
从
p_item_token
内部联接p_item.itemid = p_item_token.itemid p_item
哪里
p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx;
表p_item_token,对应是主键,和令牌是唯一的指标。Itemid在p_item主键
按照理想的速度,这应该是正常的在0.03s.but现实是0.2左右,慢了很多。
直接说明看计划
解释
选择
p_item_token *,
p_item.product_type
从
p_item_token
内部联接p_item.itemid = p_item_token.itemid p_item
哪里
p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx;
结果uff1a
看上面的红色框,p_item表2W的数据,这是全表扫描。
这不正常。
添加一个显示警告。注意:在某些情况下,显示警告将没有结果。我不知道为什么。建议使用本地测试数据库运行。
解释
选择
p_item_token *,
p_item.product_type
从
p_item_token
内部联接p_item.itemid = p_item_token.itemid p_item
哪里
p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx;
显示警告;
结果2显示在代码= 1003后面有一个SQL语句..这个语句是MySQL在我们重写规则后的SQL语句中执行的最后语句。
选择# 1 / * * /
选择
0000eb612d78407a91a9b3854ffffffff'as ` ITEMID ` / *注:根据直接查看主键值。
db87a780427d4d02ba2bd49fac8cf98b'as `令牌`,
2016-12-16 10:46:53'as ` create_time `,
` ftoken `,
` p_db `。` p_item `。` product_type `作为` product_type `
从
` p_db ` ` p_item_token `。
加入` p_db ` ` p_item `。
哪里
(
(
(CONVERT
` p_db `。` p_item `。` ITEMID `使用utf8mb4
= = '0000eb612d78407a91a9b3854fffffff
)
)
真奇怪,怎么会有皈依者呢我们知道,如果方程的左边的位置,也就是说,在字段上有一个函数要查询,它会导致慢。(我的理解是:因为索引不被使用而变慢。索引的值是原始值,它是在处理后的值中使用的)。
看看这个功能,这意味着转换成列的对应utf8mb4编码。那就是,此栏不utf8mb4!
打开表和改变在两个表的对应列为UTF8编码。再次运行说明。
解释结果没有问题。
再看一下结果2中的语句:
选择# 1 / * * /
选择
0000eb612d78407a91a9b3854fffffff'as ` ITEMID `,
db87a780427d4d02ba2bd49fac8cf98b'as `令牌`,
2016-12-16 10:46:53'as ` create_time `,
` ftoken `,
cxx'as ` product_type `
从
` toy_item_plat ` ` p_item_token `。
加入` toy_item_plat ` ` p_item `。
哪里
一
这个选项都是常量,速度可以快吗
执行的结果0.036s.conforming预期
经验总结:
解释可以看出执行计划是否符合预期,如果有较大的行情况,它显示了一个完整的表扫描,这将是未来的性能瓶颈。
由于显示警告,您可以在优化器处理该语句后看到该语句。如果与原始语句有差异,仔细的对比研究可以发现实际问题。