我有点困惑这种MySQL行为。

一个带有ORDER BY子句的查询将创建tmp表(如show profile所示),并且运行速度更快,即使没有order with with的相同查询也不会创建tmp table。为什么?为什么“排序”出现在配置文件输出中,而没有ORDER BY存在?

所以,从一开始。

我有关于amazon m1.small实例的mysql5.1。

我有4个表格,如:

CREATE TABLE `meetings_m` (

`id` int(11) unsigned NOT NULL DEFAULT '0',

`name` varchar(255) DEFAULT NULL,

`address1` varchar(255) DEFAULT NULL,

`address2` varchar(255) DEFAULT NULL,

`city` varchar(255) DEFAULT NULL,

`state` varchar(50) DEFAULT NULL,

`zip` varchar(255) DEFAULT NULL,

`country` varchar(255) DEFAULT NULL,

`latitude` double NOT NULL,

`longitude` double NOT NULL,

`user_id` int(11) unsigned NOT NULL,

`image_url` varchar(250) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

KEY `name` (`name`)

) ENGINE=MEMORY DEFAULT CHARSET=latin1

CREATE TABLE `meeting_times_m` (

`id` int(11) unsigned NOT NULL DEFAULT '0',

`meeting_id` int(11) unsigned NOT NULL,

`day` varchar(255) NOT NULL,

`time` time NOT NULL,

`name` varchar(50) NOT NULL,

`format` varchar(255) DEFAULT NULL,

`notes` varchar(255) NOT NULL,

`program` varchar(255) NOT NULL,

`cancelled` varchar(10) NOT NULL DEFAULT 'False',

PRIMARY KEY (`id`),

KEY `meeting_id` (`meeting_id`),

KEY `program` (`program`)

) ENGINE=MEMORY DEFAULT CHARSET=latin1

CREATE TABLE `real_meeting_tags_m` (

`id` int(10) unsigned NOT NULL DEFAULT '0',

`meeting_id` int(10) unsigned NOT NULL,

`tag_id` int(10) unsigned NOT NULL,

PRIMARY KEY (`id`),

KEY `meeting_id` (`meeting_id`),

KEY `tag_id` (`tag_id`)

) ENGINE=MEMORY DEFAULT CHARSET=latin1

CREATE TABLE `tags_m` (

`id` int(11) unsigned NOT NULL DEFAULT '0',

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MEMORY DEFAULT CHARSET=latin1=========================

现在我跑了

SELECT SQL_CALC_FOUND_ROWS

Meeting.*,

3959.87*acos(sin(radians(37.7858))*sin(radians(latitude))+cos(radians(37.7858))*cos(radians(latitude))*cos(radians(-122.406-longitude))) as distance,

count(`MeetingTag`.`id`) as tag_count,

group_concat(distinct Tag.name) as tags,

group_concat(distinct Tag.id) as tag_ids

FROM

`meetings_m` AS `Meeting`

LEFT JOIN `meeting_times_m` AS `MeetingTime` ON (`MeetingTime`.`meeting_id` = `Meeting`.`id`)

INNER JOIN `real_meeting_tags_m` AS `MeetingTag` ON (`MeetingTag`.`meeting_id`=`Meeting`.`id` AND (`MeetingTag`.`tag_id` in (9,8,16,14,4,2,5,15,11,7,10,13,3,6)))

LEFT JOIN `tags_m` AS `Tag` ON (`MeetingTag`.`tag_id` = `Tag`.`id`)

WHERE

3959.87*acos(sin(radians(37.7858))*sin(radians(latitude))+cos(radians(37.7858))*cos(radians(latitude))*cos(radians(-122.406-longitude))) <= '204.0'

AND `MeetingTime`.`program` = ('AA') AND ((`Meeting`.`name` LIKE 'AA%') OR (`MeetingTime`.`program` LIKE 'AA%'))

GROUP BY

`MeetingTag`.`meeting_id`

ORDER BY `distance` ASC

LIMIT 22此查询运行36秒,其配置文件为

| Status | Duration |

+--------------------------------+----------+

| starting | 0.000027 |

| checking query cache for query | 0.000217 |

| checking permissions | 0.000005 |

| checking permissions | 0.000002 |

| checking permissions | 0.000003 |

| checking permissions | 0.000005 |

| Opening tables | 0.000019 |

| System lock | 0.000004 |

| Table lock | 0.000059 |

| init | 0.000075 |

| optimizing | 0.000030 |

| statistics | 0.000081 |

| preparing | 0.000035 |

| Creating tmp table | 0.000059 |

| executing | 0.000004 |

| Copying to tmp table | 0.352465 |

| Creating sort index | 0.001807 |

| Copying to group table | 0.005540 |

| Sorting result | 0.000776 |

| Sending data | 0.002716 |

| end | 0.000006 |

| removing tmp table | 0.000009 |

| end | 0.000003 |

| removing tmp table | 0.000425 |

| end | 0.000007 |

| query end | 0.000004 |

| freeing items | 0.000020 |

| removing tmp table | 0.000005 |

| freeing items | 0.000005 |

| removing tmp table | 0.000004 |

| freeing items | 0.000526 |

| storing result in query cache | 0.000010 |

| logging slow query | 0.000003 |

| cleaning up | 0.002318 |复制到tmp表时0.35秒。

解释是

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+----------------------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+----------------------------------------------+

| 1 | SIMPLE | MeetingTime | ref | meeting_id,program | program | 257 | const | 7129 | Using where; Using temporary; Using filesort |

| 1 | SIMPLE | MeetingTag | ref | meeting_id,tag_id | meeting_id | 4 | stepsaway.MeetingTime.meeting_id | 2 | Using where |

| 1 | SIMPLE | Tag | eq_ref | PRIMARY | PRIMARY | 4 | stepsaway.MeetingTag.tag_id | 1 | |

| 1 | SIMPLE | Meeting | eq_ref | PRIMARY,name | PRIMARY | 4 | stepsaway.MeetingTag.meeting_id | 1 | Using where |

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+----------------------------------------------+所以我想要更快地查询。所以我认为跳过tmp表格会有所帮助。阅读完一些人后,我将group by从MeetingTag.meeting_id更改为MeetingTime.meeting_id(因为它们相同)并删除了order by子句

现在查询是

SELECT SQL_CALC_FOUND_ROWS

Meeting.*,

3959.87*acos(sin(radians(37.7858))*sin(radians(latitude))+cos(radians(37.7858))*cos(radians(latitude))*cos(radians(-122.406-longitude))) as distance,

count(`MeetingTag`.`id`) as tag_count,

group_concat(distinct Tag.name) as tags,

group_concat(distinct Tag.id) as tag_ids

FROM

`meetings_m` AS `Meeting`

LEFT JOIN `meeting_times_m` AS `MeetingTime` ON (`MeetingTime`.`meeting_id` = `Meeting`.`id`)

INNER JOIN `real_meeting_tags_m` AS `MeetingTag` ON (`MeetingTag`.`meeting_id`=`Meeting`.`id` AND (`MeetingTag`.`tag_id` in (9,8,16,14,4,2,5,15,11,7,10,13,3,6)))

LEFT JOIN `tags_m` AS `Tag` ON (`MeetingTag`.`tag_id` = `Tag`.`id`)

WHERE

3959.87*acos(sin(radians(37.7858))*sin(radians(latitude))+cos(radians(37.7858))*cos(radians(latitude))*cos(radians(-122.406-longitude))) <= '204.0'

AND `MeetingTime`.`program` = ('AA') AND ((`Meeting`.`name` LIKE 'AA%') OR (`MeetingTime`.`program` LIKE 'AA%'))

GROUP BY

`MeetingTime`.`meeting_id`

LIMIT 22解释是

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+-----------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+-----------------------------+

| 1 | SIMPLE | MeetingTime | ref | meeting_id,program | program | 257 | const | 7129 | Using where; Using filesort |

| 1 | SIMPLE | MeetingTag | ref | meeting_id,tag_id | meeting_id | 4 | stepsaway.MeetingTime.meeting_id | 2 | Using where |

| 1 | SIMPLE | Tag | eq_ref | PRIMARY | PRIMARY | 4 | stepsaway.MeetingTag.tag_id | 1 | |

| 1 | SIMPLE | Meeting | eq_ref | PRIMARY,name | PRIMARY | 4 | stepsaway.MeetingTag.meeting_id | 1 | Using where |

+----+-------------+-------------+--------+--------------------+------------+---------+----------------------------------+------+-----------------------------+执行时间为42秒。

个人资料是

+--------------------------------+----------+

| Status | Duration |

+--------------------------------+----------+

| starting | 0.000026 |

| checking query cache for query | 0.000211 |

| checking permissions | 0.000005 |

| checking permissions | 0.000003 |

| checking permissions | 0.000003 |

| checking permissions | 0.000005 |

| Opening tables | 0.000019 |

| System lock | 0.000003 |

| Table lock | 0.000058 |

| init | 0.000075 |

| optimizing | 0.000031 |

| statistics | 0.000082 |

| preparing | 0.000036 |

| executing | 0.000051 |

| Sorting result | 0.145705 |

| Sending data | 0.271131 |

| end | 0.000016 |

| removing tmp table | 0.000008 |

| end | 0.000006 |

| removing tmp table | 0.000004 |

| end | 0.000007 |

| query end | 0.000004 |

| freeing items | 0.000619 |

| storing result in query cache | 0.000010 |

| logging slow query | 0.000003 |

| cleaning up | 0.000006 |

+--------------------------------+----------+排序结果和发送数据比创建tmp表格花费的时间更长!但为什么???

我正在使用MEMORY表..为什么需要这么长时间?为什么它会分类?我删除条款的顺序

mysql 内存表 速度_mysql查询速度。为什么用内存表查询tmp表比直接选择慢?相关推荐

  1. mysql 强制不走缓存_MySQL - 强制不使用缓存来测试查询速度

    我正在测试MySQL中一些查询的速度. 数据库正在缓存这些查询,这使我在测试这些查询的速度时难以获得可靠的结果. 有没有办法禁用查询缓存? 系统:Linux上的MySQL 4虚拟主机,我可以访问PHP ...

  2. mysql 排序速度_MySQL排序速度慢而且可能不稳定

    一.具体现象 有一个功能,按照算法得出的权重值,分页展示一批列表数据,权重值越大越靠前.研发同学反馈查询速度慢且排序不稳定. 排序不稳定的具体现象,有不少记录存在相同权重值,某条记录(假设id=100 ...

  3. mysql 修复表字段_mysql数据库总结一【安装,配置,表操作,字段操作,增删改, 备份-恢复,select查询】...

    服务器端安装 安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入 sudo apt-get install mysql-server 启动服务 sudo service mysql star ...

  4. mysql 大分页查询优化_Mysql骚操作:优化大分页查询

    背景 系统结构如上图.经过排查是因为系统B拉取数据时间太长导致的推送超时. 系统B拉取数据的方法是根据_tiemstamp(数据操作时间)分页查询系统A的接口,即: 1SELECT 字段名2FROM  ...

  5. 讲mysql执行流程书籍_MySQL 基础架构 1. 一条SQL查询语句的执行过程(个人学习笔记)...

    MySQL的逻辑架构图: MySQL 大体分为 "server 层" 和 "存储引擎层" 两部分: Server 层 包括 连接器.查询缓存.分析器.优化器.执 ...

  6. mysql 两个数据库指定表同步_mysql从2个数据库中同步两个表

    我无法相信你没有找到合适的脚本来做到这一点.根据服务器到服务器的带宽和连接以及表数据大小,您可以: >直接转移整个表: mysqldump [options] sourcedatabase ta ...

  7. sql数据表改为自动递增显示与其他表关联_MySQL萌新第一季 第四话-数据表的基本操作...

    本话旨在完成以下内容: 在数据库中,数据表是数据库中最重要和基本的操作对象,是数据存储的基本单位.换句话说我们操作数据库其实重要的就是操作数据表.本章将详细介绍数据表的基本操作,主要内容包括:创建数据 ...

  8. mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理

    MySQL基础篇(01):经典实用查询案例,总结整理 发布时间:2020-02-26 22:25:21 来源:51CTO 阅读:244 作者:知了一笑 本文源码:GitHub·点这里 || GitEE ...

  9. mysql 数据记录导出_mysql如何导出600万条记录的数据表?

    目前我这么写: /** * Created by IntelliJ IDEA. * User: felix * Date: 2019-03-01 * Time: 18:49 */ set_time_l ...

  10. mysql 关注 表设计_mysql - 新浪微博中的关注功能是如何设计表结构的?

    问 题 新浪微博中,假如a关注了200个用户,300个用户关注了a,点解的时候会看到所有关注a或者a关注的用户,这种表结构是如何实现的? 解决方案 个人简单猜测,如有雷同,纯属巧合!有错误请指正! u ...

最新文章

  1. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...
  2. springboot事物注解不生效_SpringBoot攻略三、配置文件说明
  3. JLink接口的SWD接法
  4. WINCE 加入驱动DLL步骤
  5. git push/pull时总需要输入用户名密码的解决方案
  6. TCP/IP的初步理解,TCP和UDP的区别
  7. dosbox详细安装级及使用
  8. Rhino结合AD、keyshot进行建模和渲染
  9. 下行文格式图片_通知的格式及范文图片_通知格式 通知的格式及范文
  10. 弘辽科技:直通车引流逻辑。
  11. 学习日记 | 云计算 - 服务模型 - 三层架构(深度学习)
  12. android studio 连接夜神模拟器
  13. Arduino LED闪烁
  14. 怎么将多张图片打印在一张A4纸上?
  15. 一键将苹果实况照片livp转jpg的简单方法
  16. react 实现渐变色背景样式
  17. 《死亡搁浅》:在“联结”的世界里,是 “个人”在游戏中
  18. 【C++】STL容器之string使用(赋值、拼接、查找、替换、比较、截取、插入、删除、子串)
  19. 联想y7000电脑未正确启动_Lenovo/联想 拯救者 Y7000简单装系统教程
  20. 用结构体练习 考生信息录入

热门文章

  1. python爬虫要安装什么_python爬虫之分布式爬虫和部署
  2. 【毕业答辩】毕业论文答辩自诉如何写?
  3. python实现app自动签到器_Python实现自动签到脚本代码示例
  4. bypass最新版d盾mysql_Bypass D盾_IIS防火墙SQL注入防御(多姿势)
  5. C++面试题-面向对象-构造函数和析构函数
  6. Halcon PDF文档(extension_package_programmers_manual)学习总结
  7. 最近对焦距离与最大放大倍率
  8. Windows提升进程权限
  9. 一次磁盘满的系统故障
  10. 智慧城市发展路径中 中国特色是主色调