ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PHP-MySQL查询从10,000个数据中检索速度太慢(查询优化)

2019-11-20 06:31:35  阅读:430  来源: 互联网

标签:join subquery mysqli left-join php


会员,会员和付款表中的10,000个数据.在每个会员的最新付款中搜索特定付款状态时,检索查询的速度太慢.

SELECT m.id AS member_id, m.full_name, m.unit, m.street, m.block, m.country,   m.postal_code, cat . * , cat.id AS cat_id, mem.membership_num, mem.id AS membership_id
FROM memberships mem
LEFT JOIN category cat ON mem.category_id = cat.id
LEFT JOIN members m ON mem.member_id = m.id
WHERE m.id >0
AND m.status = 'active'
AND (
  mem.category_id
  BETWEEN 1
  AND 11
)
AND (
  SELECT p1.payment_status_id
  FROM payments p1
  WHERE p1.category_id = cat.id
  AND p1.member_id = mem.member_id
  AND p1.payment_status_id = '1'
  LIMIT 1
  ) != ''
GROUP BY CONCAT( cat.id, '_', m.unit, '_', m.postal_code )
ORDER BY m.full_name ASC
LIMIT 0 , 25

说明

查询运行太慢21.00秒至99.00秒

解决方法:

问题

在具有多个联接和子查询以检索表中大量数据(约10,000个)的mysql查询中,该页面的运行速度变慢了(3-5分钟而不是几秒钟).

解决方案-使用的列索引

添加索引并完成各种搜索查询,检索效果更好.

笔记

索引用于快速查找具有特定列值的行.没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行.桌子越大,花费越多.如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据.这比顺序读取每一行要快得多.

改善SELECT操作性能的最佳方法是在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配,并检索这些行的其他列值.所有MySQL数据类型都可以建立索引.

eg: ALTER TABLE `memberships` ADD INDEX ( `category_id` ) ;

缺点:索引是您可以在MySQL表上启用的一些额外功能,以提高性能,但是它们确实有一些缺点.当您创建一个新索引时,MySQL将构建一个单独的信息块,每次对该表进行更改时都需要更新该信息块.这意味着,如果您不断更新,插入和删除表中的条目,可能会对性能产生负面影响.

教程mysql.com,howtoforge.com,tizag.com

谢谢

@venca @鲍里斯@Raja Amer Khan和所有

感谢所有帮助我解决问题的人.

标签:join,subquery,mysqli,left-join,php
来源: https://codeday.me/bug/20191120/2041795.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有