Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库性能问题_Mysql_Sql_Performance - Fatal编程技术网

Mysql 数据库性能问题

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

在非常基本的查询中,我遇到了一些查询时间长的问题。这是我第一次使用更大的表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秒


我当然可以提供更多的信息,但有什么明显的原因可以解释为什么它们运行得如此缓慢

是的,有两个突出的问题。在第一个查询中,您没有任何条件,因此您要求读取、分组和汇总整个销售表。分组还将创建一个临时表。因此,您将进行表扫描,这将限于硬件在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 ;