Bug #61223 | SQL_CALC_FOUND_ROWS kills performance with left join ,join,right join and LIMIT | ||
---|---|---|---|
Submitted: | 19 May 2011 1:57 | Modified: | 22 Oct 2012 4:51 |
Reporter: | shu xinyi | Email Updates: | |
Status: | No Feedback | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S5 (Performance) |
Version: | 5.0 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[19 May 2011 1:57]
shu xinyi
[19 May 2011 3:11]
Valeriy Kravchuk
Please, send the results of EXPLAIN for the problematic SELECT with SQL_CALC_FOUND_ROWS and without this clause.
[19 May 2011 6:19]
心意 舒
explain select sql_calc_found_rows * from vreqinfos limit 1000,1000; +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ | 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 2178824 | | | 1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 8 | vtms3000.a.IDeviceId | 1 | | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | vtms3000.a.iMIbNodeCode | 1 | | +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ vreqinfos 定义如下: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql`@`%` SQL SECURITY DEFINER VIEW `vreqinfos` AS select `a`.`iReqInfoId` AS `iReqInfoId`, `a`.`IDeviceId` AS `IDeviceId`, `b`.`sDevName` AS `sDevName`, `a`.`iReqTime` AS `iReqTime`, `a`.`iMIbNodeCode` AS `iMibNodeCode`, `c`.`sMibNodeName` AS `sMibNodeName`, `a`.`sValue` AS `sValue`, `a`.`iRowNum` AS `iRowNum` from ((`qreqinfos` `a` left join `qdevices` `b` on((`a`.`IDeviceId` = `b`.`iDeviceId`))) left join `qsnmpmib` `c` on((`a`.`iMIbNodeCode` = `c`.`iMibNodeCode`)));
[19 May 2011 7:07]
Valeriy Kravchuk
So, your query just has to read all rows from the a table (there are no filtering conditions on it, and you left join other tables to it). Table is big enough. Why do you think there is any bug here?
[19 May 2011 11:32]
心意 舒
I make a test,comparing two cases: 0.01210275 | select * from vreqinfos limit 1000,1000 8.863353 | select sql_calc_found_rows * from vreqinfos limit 1000,1000 The first query spend 0.01210275 secs, and the second query spend 8.863353 secs. I think sql_calc_found_rows make the query performance lower.
[19 May 2011 12:22]
Valeriy Kravchuk
Please, send the results of EXPLAIN select * from vreqinfos limit 1000,1000 ; What exact server version, 5.0.x, do you use?
[20 May 2011 0:43]
心意 舒
the vreqinfos define: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql`@`%` SQL SECURITY DEFINER VIEW `vreqinfos` AS select `a`.`iReqInfoId` AS `iReqInfoId`, `a`.`IDeviceId` AS `IDeviceId`, `b`.`sDevName` AS `sDevName`, `a`.`iReqTime` AS `iReqTime`, `a`.`iMIbNodeCode` AS `iMibNodeCode`, `c`.`sMibNodeName` AS `sMibNodeName`, `a`.`sValue` AS `sValue`, `a`.`iRowNum` AS `iRowNum` from ((`qreqinfos` `a` left join `qdevices` `b` on((`a`.`IDeviceId` = `b`.`iDeviceId`))) left join `qsnmpmib` `c` on((`a`.`iMIbNodeCode` = `c`.`iMibNodeCode`))); explain select * from vreqinfos limit 1000,1000; +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ | 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 2178824 | | | 1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 8 | vtms3000.a.IDeviceId | 1 | | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | vtms3000.a.iMIbNodeCode | 1 | | +----+-------------+-------+--------+---------------+---------+---------+-------------------------+---------+-------+ the version of mysql is 5.0.51b-community-nt
[31 Dec 2011 15:18]
Valeriy Kravchuk
Please, check if the same problem still happens with a newer versions, 5.0.91 at least or (as 5.0 support ends today) 5.1.60 or 5.5.19.
[4 Jan 2012 3:30]
心意 舒
Test: mysql> show variables like '%version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | innodb_version | 1.1.5 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.5.9-log | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | x86 | | version_compile_os | Win32 | +-------------------------+------------------------------+ The version of mysql is 5.5.9-log,OS is win32. mysql> set profiling=1; mysql> select * from vreqinfos limit 1000,1000; mysql> select sql_calc_found_rows * from vreqinfos limit 1000,1000; mysql> show profiles; +----------+-----------+-------------------------------------------------------------+ | Query_ID | Duration | Query | +----------+-----------+-------------------------------------------------------------+ | 1 | 0.0307945 | select * from vreqinfos limit 1000,1000 | | 2 | 15.674417 | select sql_calc_found_rows * from vreqinfos limit 1000,1000 | +----------+-----------+-------------------------------------------------------------+ The second query spend more time than the first one.The difference is very large. I guess this is a bug. The vreqinfos define as: CREATE or REPLACE VIEW vreqinfos AS select a.iReqInfoId AS iReqInfoId, a.IDeviceId AS IDeviceId, b.sDevName AS sDevName, a.iReqTime AS iReqTime, a.iMibNodeCode AS iMibNodeCode, c.sMibNodeName AS sMibNodeName, a.sValue AS sValue, a.iRowNum AS iRowNum from qreqinfos a left join qdevices b on a.IDeviceId = b.iDeviceId left join qsnmpmib c on a.iMibNodeCode = c.iMibNodeCode;
[22 Sep 2012 4:51]
MySQL Verification Team
Please try version 5.5.27. Thanks.
[23 Oct 2012 1:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".