Mysql 数据库性能问题
在非常基本的查询中,我遇到了一些查询时间长的问题。这是我第一次使用更大的表1250万行,我只是想弄清楚什么可能是瓶颈,或者我可以做些什么来提高性能。所有数据都在表1中 服务器规格: Windows Server 2008 R2标准 英特尔至强X3430@2.40GHz 4GB内存 1TB 7200RPM硬盘驱动器 表信息 ID int10 UN PK AI 存储int2 UN 日期时间 注册int2 UN 国际收银员3 联合国国际部 总小数点7,2 客户国际5联合国 项目国际5联合国 国际时间5日 示例查询和时间 19.56秒 9.59秒Mysql 数据库性能问题,mysql,sql,performance,Mysql,Sql,Performance,在非常基本的查询中,我遇到了一些查询时间长的问题。这是我第一次使用更大的表1250万行,我只是想弄清楚什么可能是瓶颈,或者我可以做些什么来提高性能。所有数据都在表1中 服务器规格: Windows Server 2008 R2标准 英特尔至强X3430@2.40GHz 4GB内存 1TB 7200RPM硬盘驱动器 表信息 ID int10 UN PK AI 存储int2 UN 日期时间 注册int2 UN 国际收银员3 联合国国际部 总小数点7,2 客户国际5联合国 项目国际5联合国 国际时间5
我当然可以提供更多的信息,但有什么明显的原因可以解释为什么它们运行得如此缓慢 是的,有两个突出的问题。在第一个查询中,您没有任何条件,因此您要求读取、分组和汇总整个销售表。分组还将创建一个临时表。因此,您将进行表扫描,这将限于硬件在io性能方面所能提供的,这可能是您的瓶颈 在第二个查询中,您正在对Date列DateDate执行一个函数,这意味着即使您在Date上有一个索引,它也将无法使用该索引,因此您将再次扫描表
话虽如此,您应该运行explain extended SELECT。。。。在每次查询中,您都可以获得此评估的信心。在第二次查询中,您可以尝试两件事: 1为datetime列创建索引。 2使用整数代替日期时间,2013-10-22=>20131022
SELECT Store, sum(Total)
FROM sales
GROUP BY Store ;
在存储上添加索引,总计:
问题2:
SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date(Date) = Date('2013-10-22')
AND Store = 1 ;
在存储上添加索引,日期:
并重写查询-以便可以使用索引-如下所示:
SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date >= '2013-10-22'
AND Date < '2013-10-22' + INTERVAL 1 DAY
AND Store = 1 ;
你的索引是什么?使用explain并告诉我们select语句的结果。由于索引的原因,速度可能会很慢,那么my.ini配置文件也可能是问题所在。添加SHOW CREATE table sales(显示创建表销售)而不是您拥有的表信息;输出了解表结构和索引的详细信息对其他人更有帮助。谢谢您的建议!我必须研究DateDate是否有替代方案,我一定会查看explain extended。将explain extended的结果粘贴到您的问题中:这将有助于@ypercube和我更好地理解您的问题。您还可以在mysql实例上调优参数,因此这些参数可能会有所帮助。你的表是innodb引擎吗?我强烈推荐。谢谢你的回复!将索引添加到第一个查询后,时间下降到大约9秒。在第二个查询中去掉DateDate并用你的建议替换它就可以将查询时间缩短到1.6秒。这听起来还是很低效的。我建议您检查您的mysql配置。设置。
ALTER TABLE sales
ADD INDEX store_total_IX -- pick a name for the index
(store, total) ;
SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date(Date) = Date('2013-10-22')
AND Store = 1 ;
ALTER TABLE sales
ADD INDEX store_date_IX -- pick a name for the index
(store, date) ;
SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date >= '2013-10-22'
AND Date < '2013-10-22' + INTERVAL 1 DAY
AND Store = 1 ;