123
返回列表 发新帖
楼主: gyjohn

Mysql 简单SELECT,第一次很慢,以后很快,这是什么问题

[复制链接]
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-07-09 17:23:56路虎
日期:2013-07-30 17:38:11
21#
发表于 2013-1-11 14:47 | 只看该作者
我仍然怀疑索引没有在内存中,你试下不使用索引多少时间?ignore index(INDEX_LOGIN,INDEX_CLOSETIME)。

使用道具 举报

回复
论坛徽章:
1
咸鸭蛋
日期:2013-04-29 10:44:35
22#
 楼主| 发表于 2013-1-11 16:34 | 只看该作者
本帖最后由 gyjohn 于 2013-1-11 17:00 编辑
myeverything 发表于 2013-1-11 14:47
我仍然怀疑索引没有在内存中,你试下不使用索引多少时间?ignore index(INDEX_LOGIN,INDEX_CLOSETIME)。

靠,ignore index竟然更快,不相信,重启跑了几次,结果都是走Index更慢。怎么办?

不用索引 10秒左右
用索引 10几秒-20几秒
Load cache然后用索引 3秒 + 10几秒

使用道具 举报

回复
论坛徽章:
1
咸鸭蛋
日期:2013-04-29 10:44:35
23#
 楼主| 发表于 2013-1-11 16:40 | 只看该作者
本帖最后由 gyjohn 于 2013-1-11 16:42 编辑

EXPLAIN --不用索引
select  count(*) from table_name N0  ignore index(INDEX_LOGIN,INDEX_CLOSETIME)
where (N0.`CLOSE_TIME` >= '2012/11/21') and (N0.`CLOSE_TIME` < '2012/11/22')  and N0.`Login` = 3000
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
SIMPLE
N0
ALL
(null)
(null)
(null)
(null)
3877541
Using where


EXPLAIN --用索引
select  count(*) from table_name  N0
where (N0.`CLOSE_TIME` >= '2012/11/21') and (N0.`CLOSE_TIME` < '2012/11/22')  and N0.`Login` = 3000
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
SIMPLE
N0
range
INDEX_LOGIN,INDEX_CLOSETIME
INDEX_CLOSETIME
8
(null)
61590
Using where

使用道具 举报

回复
论坛徽章:
11
鲜花蛋
日期:2011-09-03 18:52:38鲜花蛋
日期:2011-11-09 10:10:12茶鸡蛋
日期:2011-11-19 22:46:41茶鸡蛋
日期:2011-12-14 15:16:572012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:赛艇
日期:2012-09-26 21:40:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24
24#
发表于 2013-1-11 17:23 | 只看该作者
肯定是缓存的影响啊,第一次select count(*)后很多数据都会cache在buffer pool里面,以后就会快很多了。事实上很多时候都用select count(*) 或者 select max(id)这种类似的方法来做buffer pool的预热

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2013-1-11 17:35 | 只看该作者
gyjohn 发表于 2013-1-8 22:56
slow log也是记录这些sql, Explain结果里的key是INDEX_CLOSETIME,不单止possible_keys里有。

query_cac ...

query_cache_size        0

查询缓存区域大小是0,开启了也没用

使用道具 举报

回复
论坛徽章:
1
咸鸭蛋
日期:2013-04-29 10:44:35
26#
 楼主| 发表于 2013-1-11 18:34 | 只看该作者
icer_repls 发表于 2013-1-11 17:23
肯定是缓存的影响啊,第一次select count(*)后很多数据都会cache在buffer pool里面,以后就会快很多了。事实 ...

问题是同样第一次运行,SQLServer只要2秒,Mysql要2分钟

使用道具 举报

回复
论坛徽章:
11
鲜花蛋
日期:2011-09-03 18:52:38鲜花蛋
日期:2011-11-09 10:10:12茶鸡蛋
日期:2011-11-19 22:46:41茶鸡蛋
日期:2011-12-14 15:16:572012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:赛艇
日期:2012-09-26 21:40:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24
27#
发表于 2013-1-12 13:01 | 只看该作者
gyjohn 发表于 2013-1-11 18:34
问题是同样第一次运行,SQLServer只要2秒,Mysql要2分钟

不同的数据库对select count(*)做了优化的,所以你最后去查一下SQL SERVER的文档确定一下,我个人觉得是这个原因。

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2013-1-18 10:05 | 只看该作者
要使第二次不受query cache的影响,  可以在SQL的某个地方加几个空格, 或者跑第二次之前, FLUSH QUERY CACHE

使用道具 举报

回复
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
29#
发表于 2013-1-18 23:40 | 只看该作者
可以在select后面加no_sql_cache来试试不用缓存的,再看看2个sql执行结果如何?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表