以下查询非常简单.它从消息表中选择最后20条记录,以便在分页方案中使用.第一次运行此查询时,需要15到30秒.后续运行只需不到一秒钟(我预计会涉及一些缓存).我试图确定为什么第一次这么长时间.

这是查询:

SELECT DISTINCT ID,List,`From`,Subject, UNIX_TIMESTAMP(MsgDate) AS FmtDate

FROM messages

WHERE List='general'

ORDER BY MsgDate

LIMIT 17290,20;

MySQL版本:4.0.26-log

这是表格:

messages CREATE TABLE `messages` (

`ID` int(10) unsigned NOT NULL auto_increment,

`List` varchar(10) NOT NULL default '',

`MessageId` varchar(128) NOT NULL default '',

`From` varchar(128) NOT NULL default '',

`Subject` varchar(128) NOT NULL default '',

`MsgDate` datetime NOT NULL default '0000-00-00 00:00:00',

`TextBody` longtext NOT NULL,

`HtmlBody` longtext NOT NULL,

`Headers` text NOT NULL,

`UserID` int(10) unsigned default NULL,

PRIMARY KEY (`ID`),

UNIQUE KEY `List` (`List`,`MsgDate`,`MessageId`),

KEY `From` (`From`),

KEY `UserID` (`UserID`,`List`,`MsgDate`),

KEY `MsgDate` (`MsgDate`),

KEY `ListOnly` (`List`)

) TYPE=MyISAM ROW_FORMAT=DYNAMIC

这是解释:

table type possible_keys key key_len ref rows Extra

------ ------ ------------- -------- ------- ------ ------ --------------------------------------------

m ref List,ListOnly ListOnly 10 const 18002 Using where; Using temporary; Using filesort

当我在所有相关列上都有索引时,为什么使用filesort?我添加了ListOnly索引,看看它是否有用.我原本以为List索引会处理列表选择和MsgDate上的排序,但事实并非如此.现在我添加了ListOnly索引,这是它使用的索引,但它仍然在MsgDate上执行一个文件排序,这是我怀疑花了这么长时间.

我尝试使用FORCE INDEX如下:

SELECT DISTINCT ID,List,`From`,Subject, UNIX_TIMESTAMP(MsgDate) AS FmtDate

FROM messages

FORCE INDEX (List)

WHERE List='general'

ORDER BY MsgDate

LIMIT 17290,20;

这似乎迫使MySQL使用索引,但它根本不会加速查询.

以下是此查询的说明:

table type possible_keys key key_len ref rows Extra

------ ------ ------------- ------ ------- ------ ------ ----------------------------

m ref List List 10 const 18002 Using where; Using temporary

更新:

我从查询中删除了DISTINCT.它根本没有帮助.

我删除了UNIX_TIMESTAMP调用.它也没有影响性能.

我在我的PHP代码中做了一个特例,这样如果我检测到用户正在查看结果的最后一页,我会添加一个WHERE子句,它只返回结果的最后7天:

SELECT m.ID,List,From,Subject,MsgDate

FROM messages

WHERE MsgDate>='2009-11-15'

ORDER BY MsgDate DESC

LIMIT 20

这要快得多.但是,只要我导航到另一个结果页面,它就必须使用旧的SQL并且需要很长时间才能执行.我想不出一个实用,现实的方法来为所有页面执行此操作.此外,这种特殊情况使我的PHP代码更加复杂.

奇怪的是,只有第一次运行原始查询需要很长时间.后续运行相同的查询或显示不同结果页面的查询(即,只有LIMIT子句发生变化)非常快.如果查询尚未运行约5分钟,则查询会再次变慢.

解:

我想出的最佳解决方案是基于Jason Orendorff和Juliet的想法.

首先,我确定当前页面是否更接近总页数的开头或结尾.如果它更接近结尾,我使用ORDER BY MsgDate DESC,应用适当的限制,然后反转返回记录的顺序.

这使得检索页面接近结果集的开头或结尾的速度要快得多(第一次现在需要4-5秒而不是15-30秒).如果用户想要导航到中间附近的页面(当前在第430页左右),那么速度可能会下降.但那是一种罕见的情况.

因此,虽然似乎没有完美的解决方案,但这比大多数情况要好得多.

谢谢你,杰森和朱丽叶.

mysql 前30秒_mysql – 简单查询需要15-30秒相关推荐

  1. 简单mysql 查询_MySQL简单查询详解

    MySQL的查询操作 单表查询:简单查询 多表查询:连接查询 联合查询 布尔条件表达式操作符= 等值比较 <=>:跟空值比较不会产生额外信息的等值比较 <>:不等值 <: ...

  2. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  3. mysql查询最低工资的经历_MySQL 简单查询记录(二)

    #查询工资大于12000的员工 SELECT * FROM `employees` WHERE salary > 12000#查询部门编号不为90的员工姓名和部门 SELECT CONCAT(` ...

  4. mysql 慢日志 作用_MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...

  5. mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  6. c mysql清理日志文件_MySQL 一般查询日志或者慢查询日志历史数据的清理

    general log&slow query log 对于MySQL的一般查询日志和慢查询日志,开启比较简单,其中公用的一个参数是log_output,log_output控制着慢查询和一般查 ...

  7. mysql 查找数据过程_mysql数据库查询过程探究和优化建议

    查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...

  8. mysql的datepart函数_MySql 的查询语句中有没有Datepart函数?

    MySql   的查询语句中有没有Datepart函数? 如没有,要怎么实现? 1 楼hycao(海草)回复于 2002-11-16 20:02:46 得分 0 翻了一下资料,MySql中好象没有Da ...

  9. mysql 包含非数字_mysql 正则表达式查询含有非数字和字符的记录

    比如我们有一张school表,里面有一个字段county_name,现在我们要查询county_name字段中包含a-w字母和数字以外字符的记录,那么sql该如何写呢?请看下面的写法: select ...

最新文章

  1. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
  2. 使用 HTML5、CSS3 和 MathML 在 EPUB 3 中制作版式丰富的出版物
  3. jakarta_MicroProfile在Jakarta EE时代的作用
  4. 计算勒让德多项式系数的第二种方法
  5. java模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
  6. 【LeetCode 剑指offer刷题】回溯法与暴力枚举法题6:Number of Islands
  7. 函数的递归调用(专题)
  8. JS 原生 AJax
  9. 前端生态混乱,AMPMIP在努力做标准化工作
  10. js将中文转换成编码 java解析_JS实现的汉字与Unicode码相互转化功能分析
  11. 《银花季刊》版式海报欣赏,看大咖的神操作
  12. 请给出异步加载js方案
  13. jfinal 任务调度与jsoup 爬虫
  14. 用HTML搞一个汇率转换器,Currency Converter:实时汇率转换
  15. [转]NSIS常用代码整理
  16. Java ZIP压缩 ZipArchiveEntry实现ZIP高效、Java多线程压缩、可控CPU使用率 Apache commons-compress
  17. 透视映客半年报:亏损背后的长期价值
  18. java 常用 函数式接口_「java8系列」神奇的函数式接口
  19. 游戏数值策划属性篇(一):关于属性设计的几点思考
  20. alphacam模板@橱柜门专用alphacam模板

热门文章

  1. win 修改jvm时间_Windows 下修改Tomcat jvm参数
  2. springboot 定时器_基于SpringCloud?+?SpringBoot的 SaaS型微服务脚手架源码分享
  3. java检测安卓程序退出_java-我的Android应用程序的gameLoop线程在退出...
  4. 4.2 One-Shot 学习-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. 2.4 使用来自不同分布的数据,进行训练和测试-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  6. verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
  7. linux服务器环境要求,在Linux服务器中配置node环境
  8. 时域和频域的麦克斯韦方程组
  9. Eclipse 从git导入maven多模块项目
  10. JQuery.Ajax()的data参数传递方式