Php 优化的mySQL表索引结构,可更快地选择大范围的日常数据

Php 优化的mySQL表索引结构,可更快地选择大范围的日常数据,php,mysql,optimization,select,Php,Mysql,Optimization,Select,我想知道在mySQL表中布局数据的最佳格式,以便能够以最快的方式查询数据,以收集每日值数组,供php进一步使用 到目前为止,我已经列出了如下表格: item_id price_date price_amount 1 2000-03-01 22.4 2 2000-03-01 19.23 3 2000-03-01 13.4 4 2000-03-0

我想知道在mySQL表中布局数据的最佳格式,以便能够以最快的方式查询数据,以收集每日值数组,供php进一步使用

到目前为止,我已经列出了如下表格:

item_id    price_date     price_amount
      1    2000-03-01             22.4
      2    2000-03-01            19.23
      3    2000-03-01             13.4
      4    2000-03-01            14.95
      1    2000-03-02             22.5
      2    2000-03-02            19.42
      3    2000-03-02             13.4
      4    2000-03-02            13.95
将项_id定义为索引

此外,我正在使用:

"SELECT DISTINCT price_date FROM table_name" 
获取包含唯一日期列表的数组

此外,循环中的代码部分(也是我优化问题的重点)目前编写为:

"SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"
  "SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"
第二个“SELECT”语句实际上是在一个循环中,我在该循环中选择/存储请求的每个商品的每日价格

目前,所有这些都正常运行,并从mySQL中正确提取数据,但是,上述两个“SELECT”语句每次运行大约需要4-5秒才能完成,并且在循环100多个产品以创建摘要时,会导致信息系统效率非常低/速度非常慢

有没有更有效的方法来构造mySQL表和/或SELECT语句以更快地检索结果?也许在不同的列上定义不同的索引?我已使用EXPLAIN命令返回每个查询的信息,但不确定如何使用EXPLAIN信息来提高查询的效率


提前感谢所有能够提供帮助的mySQL向导。

单列索引

我正在使用:

  "SELECT DISTINCT price_date FROM table_name" 
获取包含唯一日期列表的数组

如果为
price\u date
列创建索引,则可以更高效地执行此查询:

ALTER TABLE table_name ADD INDEX price_idx (price_date);
 ALTER TABLE table_name ADD INDEX item_price_idx (item_id, price_date);
多列索引

此外,循环中的代码部分(也是我优化问题的重点)目前编写为:

"SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"
  "SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"
对于第二个查询,您应该创建一个索引,涵盖
item\u id
price\u date
列:

ALTER TABLE table_name ADD INDEX price_idx (price_date);
 ALTER TABLE table_name ADD INDEX item_price_idx (item_id, price_date);

我知道这有点晚了,但我无意中发现了这一点,我想我会把我的想法融入其中

使用得好的索引在加快查询速度方面非常有帮助(解释显示了一些真正的godd结果,针对特定查询选择了哪些索引(如果有的话))。然而,高效的PHP将更有帮助

在您的例子中,您没有显示PHP,但看起来您提供了一个日期列表,然后循环查找该日期中的所有项目以获得价格。执行以下操作会更有效:

从表名称中选择项目标识、价格金额,其中价格日期=按项目标识、价格金额排序的订单

具有价格日期、项目id、价格金额的索引(最好是唯一索引)

然后,通过生成的SQL有一个循环,而不是一个具有多个SQL连接的循环(如果SQL server与PHP框分离,则尤其如此,因为外部网络连接可能会产生开销)


单次查询需要4-5秒(虽然速度非常慢),至少需要100倍的时间),因此这将表明存在问题(非常大的表,没有可使用的键)或磁盘问题(可能)。

您应该创建一个索引,涵盖
item_id
price_date
列:
在表名(item_id,price_date)上创建索引t_idx;
@Groo,你能提供更多关于我将如何做的信息吗?或者链接到一篇文章,解释如何在mySQL中正确使用索引来优化查询?很抱歉,我不熟悉索引的正确方法/设置,在此之前,我不需要担心速度问题,因为返回的数据集的范围非常小。一般(简化)规则是创建一个包含
WHERE
子句中指定的所有列的索引。如果没有索引,db引擎需要扫描所有行,以找到符合条件的行(一个
O(n)
操作)。使用索引(通常实现为B树),引擎可以搜索索引(一个
O(logn)
操作),然后立即跳转到查询所覆盖的行。消极的一面是,每个索引都会增加数据库的大小,并减慢修改数据库的操作(
INSERT
UPDATE
),因为它们要求每次更新索引。当我通过phpmyadmin运行这两个命令时,我会在第一个和第二个表名的“ON table\u name(price\u date)”附近出现错误(项目编号、价格和日期);对于第二个-有任何输入吗?感谢到目前为止的帮助。仍然停留在上面提到的sql语法错误上。不确定问题是什么。@IIIOXIII:oops,对不起,我开始在表ttt上键入
创建索引xxx
,然后更改为
更改表
语法,以便在现有表上设置索引。在后一种情况下,table名称不应指定两次。谢谢Groo。第二次查询似乎没有更快地使用在item_id/price_date上定义的索引。查询前和查询后的时间戳大约需要4-5秒才能完成。尚未尝试添加第一个索引。还有其他建议吗?另外,我是否正确地需要指定其他名称对于每个索引?即第一个和第二个索引不能同时命名为t_ndx,对吗?@IIIOXIII:是的,你说得对,我将它们的名称修改为唯一的。如果这是你正在使用的查询,那么这就是引擎应该选择的覆盖索引。数据库有多大,测试查询返回多少结果?你也可以在
SELECT
之前添加
EXPLAIN
关键字以查看它的功能,但这是一个相当简单的功能。