会员,会员和付款表中的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和所有
感谢所有帮助我解决问题的人.