Bug #44615 | Mysql Craches On Select 'Like' queries on large tables | ||
---|---|---|---|
Submitted: | 1 May 2009 19:07 | Modified: | 24 Oct 2009 9:04 |
Reporter: | Steve Kirby | Email Updates: | |
Status: | No Feedback | Impact on me: | |
Category: | MySQL Server: General | Severity: | S3 (Non-critical) |
Version: | 5.0.77 | OS: | Linux |
Assigned to: | CPU Architecture: | Any |
[1 May 2009 19:07]
Steve Kirby
[2 May 2009 13:51]
Valeriy Kravchuk
Thank you for the problem report. Please, send your my.cnf file content and the results of: free Linux command. Send also the results of: explain select prospectnumber,firstname,lastname,city,state,zip,classcode,homephone, workphone,email,broker,ib,lastseen,lastedit from tbAccounts where 1 and (lastname like 'ki%' or Slastname like 'ki%') order by lastname,firstname asc limit 0,100\G show create table tbAccounts\G show table status like 'tbAccounts';
[4 May 2009 14:59]
Steve Kirby
Here is the results of the info you requested. Thank you for your quick response... my.conf: [mysqld] datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock user=mysql # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 long_query_time = 2 log-slow-queries = /var/log/mysql-slow.log # Added to tune performance query_cache_type=1 query_cache_limit=2M query_cache_size=64M key_buffer=128M table_cache=1024 thread_cache=64 interactive_timeout=100 max_allowed_packet=3145728 big-tables set-variable = max_connections=50 # [myisamchk] # key_buffer=128M # sort_buffer=128M # read_buffer=32M # write_buffer=32M # END Performance adds [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid --------------------------------------------------------- [poser@boof ~]$ free total used free shared buffers cached Mem: 10261852 3455432 6806420 0 162612 2786640 -/+ buffers/cache: 506180 9755672 Swap: 2031608 0 2031608 ------------------------------------------------- mysql> explain select -> prospectnumber,firstname,lastname,city,state,zip,classcode,homephone, -> workphone,email,broker,ib,lastseen,lastedit from tbAccounts -> where 1 and (lastname like 'ki%' or Slastname -> like 'ki%') order by lastname,firstname asc limit 0,100\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbAccounts type: index_merge possible_keys: lastname,Slastname key: lastname,Slastname key_len: 102,102 ref: NULL rows: 3966 Extra: Using sort_union(lastname,Slastname); Using where; Using filesort 1 row in set (0.00 sec) -------------------------------------------- mysql> show create table tbAccounts\G *************************** 1. row *************************** Table: tbAccounts Create Table: CREATE TABLE `tbAccounts` ( `prospectnumber` bigint(6) NOT NULL auto_increment, `prefix` varchar(100) NOT NULL default '', `firstname` varchar(100) NOT NULL default '', `midname` varchar(100) NOT NULL default '', `lastname` varchar(100) NOT NULL default '', `suffix` varchar(100) NOT NULL default '', `spousePreTitle` varchar(100) NOT NULL default '', `Sfirstname` varchar(100) NOT NULL default '', `Smidname` varchar(100) NOT NULL default '', `Slastname` varchar(100) NOT NULL default '', `Ssuffix` varchar(100) NOT NULL default '', `company` varchar(100) NOT NULL default '', `co` varchar(100) NOT NULL default '', `noAddress` varchar(10) NOT NULL default '', `nonStandard` varchar(10) NOT NULL default '', `addressline1` varchar(250) NOT NULL default '', `addressline2` varchar(250) NOT NULL default '', `country` varchar(100) NOT NULL default '', `city` varchar(100) NOT NULL default '', `state` varchar(100) NOT NULL default '', `zip` varchar(15) NOT NULL default '', `email` varchar(100) NOT NULL default '', `badAddress` varchar(10) NOT NULL default '', `homephone` varchar(15) NOT NULL default '', `workphone` varchar(15) NOT NULL default '', `foriegnphone` varchar(25) NOT NULL default '', `estDate` date NOT NULL default '0000-00-00', `classCode` varchar(10) NOT NULL default 'PRO', `initialMarketingCode` varchar(100) NOT NULL default '', `secondaryMarketingCode` varchar(100) NOT NULL default '', `comment1` text NOT NULL, `comment2` varchar(250) NOT NULL default '', `broker` varchar(25) NOT NULL default '', `STATUS` varchar(10) NOT NULL default '', `ib` varchar(100) NOT NULL default '', `balance` decimal(10,2) NOT NULL default '0.00', `wholesaler` tinyint(4) NOT NULL default '0', `brokerRecievedDate` date NOT NULL default '0000-00-00', `ibRecievedDate` date NOT NULL default '0000-00-00', `qualifiedFor` varchar(100) NOT NULL default '', `processCode` varchar(100) NOT NULL default '', `processDate` varchar(100) NOT NULL default '', `currentMarketingCode` varchar(100) NOT NULL default '', `date` date NOT NULL default '0000-00-00', `time` time NOT NULL default '00:00:00', `notes` varchar(255) NOT NULL default '', `lastseen` date NOT NULL default '0000-00-00', `lastedit` date NOT NULL default '0000-00-00', `lastmail` date NOT NULL default '0000-00-00', `lastpriority` date NOT NULL default '0000-00-00', `twentyfiveLetter` tinyint(4) NOT NULL default '0', `firstvisit` date NOT NULL default '0000-00-00', `lastemail` datetime NOT NULL default '0000-00-00 00:00:00', `workextnum` varchar(10) NOT NULL default '', `newnomore` tinyint(4) NOT NULL default '0', `birthdate` date NOT NULL default '0000-00-00', `Sbirthdate` date NOT NULL default '0000-00-00', `gstAcctNum` varchar(255) NOT NULL, `gstAcctNum2` varchar(50) NOT NULL, `iraTradeAuth` tinyint(4) NOT NULL, `setActive` date NOT NULL, `levyFlag` tinyint(4) NOT NULL, `beneficiary` varchar(150) NOT NULL, `beneficiaryCID` varchar(7) NOT NULL, `acvOnly` tinyint(4) NOT NULL, UNIQUE KEY `prospectNumber` (`prospectnumber`), KEY `lastname` (`lastname`), KEY `broker` (`broker`), KEY `wholesaler` (`wholesaler`), KEY `ib` (`ib`), KEY `firstname` (`firstname`), KEY `brokerRecievedDate` (`brokerRecievedDate`), KEY `classCode` (`classCode`), KEY `homephone` (`homephone`), KEY `workphone` (`workphone`), KEY `email` (`email`), KEY `date` (`date`), KEY `initialMarketingCode` (`initialMarketingCode`), KEY `secondaryMarketingCode` (`secondaryMarketingCode`), KEY `zip` (`zip`), KEY `foriegnphone` (`foriegnphone`), KEY `newnomore` (`newnomore`), KEY `lastseen` (`lastseen`), KEY `balance` (`balance`), KEY `addressline1` (`addressline1`), KEY `Slastname` (`Slastname`), KEY `Sfirstname` (`Sfirstname`), KEY `estDate` (`estDate`), KEY `lastmail` (`lastmail`), KEY `lastpriority` (`lastpriority`) ) ENGINE=MyISAM AUTO_INCREMENT=648893 DEFAULT CHARSET=latin1 PACK_KEYS=0 1 row in set (0.00 sec) ------------------------------------------ mysql> show table status like 'tbAccounts'; +------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+ | tbAccounts | MyISAM | 10 | Dynamic | 546966 | 179 | 98336064 | 281474976710655 | 147621888 | 0 | 648893 | 2009-03-25 11:38:26 | 2009-05-04 07:53:30 | 2009-05-01 11:56:33 | latin1_swedish_ci | NULL | pack_keys=0 | | +------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+ 1 row in set (0.00 sec)
[5 May 2009 14:07]
MySQL Verification Team
Thank you for the feedback. The involved table was created with a previous (3.23,4.0,4.1) MySQL server version? and it is possible for you to provide a dump file with insert data with the enough size to get that behavior?. Thanks in advance.
[5 May 2009 15:11]
Steve Kirby
Thanks for your reply. Unfortunately, I would not be able to provide a dump of that table as it is a customer contacts table. Like you said however, yes, this table has been up graded from earlier versions of mySQL. Several times in fact. That being the case, what would you think about this course of action?: 1. Create a new table with the same structure as "tbAccounts" called "tmp_table" 2. mysql%> insert into `tmp_table` select * from `tbAccounts` 3. mysql%> rename table `tbAccounts` `tbAccounts_old` 4. mysql%> rename table `tmp_table` `tbAccounts` This would result in the application running off of the correct data in a table which was created by the current mysql version. Would this even address the problem or I am looking in the wrong place? Either way I will attempt the procedure tonight after hours and submit the results.
[6 May 2009 15:12]
Steve Kirby
Per my last post I preformed the procedure discussed. This resulted in the exact same results. I was able to preform some tests that may provide some useful info. I discovered that if I modify the query slightly, it does not crash the database. This modifications are as such: 1. If I remove the "and (lastname like 'ki%' or Slastname like 'ki%')" and replace it with the simpler "and lastname like 'ki%'" 2. If I and add a character to the like compare string it does not crash (ie., change "and (lastname like 'ki%' or Slastname like 'ki%')" to "and (lastname like 'kir%' or Slastname like 'kir%')") Hope this helps.
[6 May 2009 18:21]
MySQL Verification Team
Thank you for the feedback. I did a small test populating on my own the table with 200k rows but against a current source server (so I need to test against a server 5.0.77) but before I would like to know the size of your table which you are able to repeat the issue. Thanks in advance.
[6 May 2009 18:25]
Steve Kirby
About table size: Rows 547327 Data 96,096 kb Index 145,990 kb Total 242,086 kb
[14 May 2009 16:07]
MySQL Verification Team
Thank you for the feedback. Still I can't repeat even with more rows than your database, are you able to create a dump file with mysqldump client tool and then restore it in a fresh create table?. Thanks in advance.
[15 May 2009 16:19]
Steve Kirby
Yes, I completed that last night with no errors or crashes.
[11 Jun 2009 20:10]
Sveta Smirnova
Thank you for the feedback. > I completed that last night with no errors or crashes. Do you still experience crashes when select or dump/reload solved the problem?
[12 Jun 2009 1:59]
Steve Kirby
Thanks for the reply. No, I never did fix the actual issue. I had to go with the unfortunate workaround of limiting the queries in one of two ways depending on users input. Either one of these modified queries returns with no crashes/errors: 1. Require the characters in the "... like 'nn%' ..." to be a minimum of 3 characters so "... like 'nn%' ..." is NOT allowed but "... like 'nnn%' ..." IS allowed. OR 2. If the user submitted input (to the application UI) contains only two characters, the query will be modified to only use the like search on one field, so: "... (lastname like 'nn%' or Slastname like 'nn%') ..." becomes: "... (lastname like 'ki%') ... "
[20 Jul 2009 9:40]
Susanne Ebrecht
This looks like because of upgrading an index got crashed. Please repair indexes here. The easiest way is: ALTER TABLE ... ENGINE=MyISAM; This will copy your whole table once and will re-build indexes. Another possibility of course is to drop the index and re-create it.
[27 Jul 2009 16:48]
Steve Kirby
I have rebuilt the indexes and the problem is the same. I will retest again after next upgrade.
[24 Sep 2009 9:04]
Susanne Ebrecht
I will set this to need feedback because we are waiting until you upgradet the next time.
[24 Oct 2009 23: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".