do u have index on dest,key On Fri, Sep 23, 2011 at 12:21 AM, Hank <hes...@gmail.com> wrote:
> > Like I said, the problem is not just one particular SQL statement. It is > several dozen statements operating on tables with several hundred million > records. The problem is that I am finding that when I use LOCK TABLES, > these queries run slower (please read my ORIGINAL post with all this > information). I am trying to find a logical or reasonable explanation WHY > this would be the case, despite the fact that the documentation states > otherwise (see: Right here: > http://dev.mysql.com/doc/refman/5.5/en/lock-tables-restrictions.html ) > > But if seeing some SQL will make you happy, here is just one example: > > UPDATE dest d straight_join source s set d.seq=s.seq WHERE d.key=s.key; > > for 140 million records in "dest" and 220 million records in "source". > Source is indexed by key+seq (key is primary key, but seq is included as a > covering index). There is no index on dest.seq -- that index is built once > the update is complete. This query takes about 3.5 hours when I don't use > LOCK TABLES, and over 4 hours when I do use LOCK TABLES. > > -Hank > > > > On Thu, Sep 22, 2011 at 2:18 PM, Ananda Kumar <anan...@gmail.com> wrote: > >> May be if u can let the audience know a sip-net of ur sql, some can help u >> >> >> On Thu, Sep 22, 2011 at 11:43 PM, Hank <hes...@gmail.com> wrote: >> >>> >>> Sorry, but you do not understand my original issue or question. >>> >>> -Hank >>> >>> >>> >>> On Thu, Sep 22, 2011 at 2:10 PM, Ananda Kumar <anan...@gmail.com> wrote: >>> >>>> No, >>>> Use a cursor(select <column_name> to be used in where condition of >>>> update stmt), loop through it for each update. >>>> >>>> regards >>>> anandkl >>>> >>>> >>>> On Thu, Sep 22, 2011 at 11:36 PM, Hank <hes...@gmail.com> wrote: >>>> >>>>> >>>>> Actually, that would be orders of magnitude slower. >>>>> >>>>> I'm using MYISAM tables, so there's no commit. >>>>> >>>>> >>>>> >>>>> >>>>> On Thu, Sep 22, 2011 at 1:48 PM, Ananda Kumar <anan...@gmail.com>wrote: >>>>> >>>>>> Hi, >>>>>> Why dont u use a stored proc to update rows ,where u commit for every >>>>>> 1k or 10k rows. >>>>>> This will be much faster than ur individual update stmt. >>>>>> >>>>>> regards >>>>>> anandkl >>>>>> >>>>>> On Thu, Sep 22, 2011 at 8:24 PM, Hank <hes...@gmail.com> wrote: >>>>>> >>>>>>> That is what I'm doing. I'm doing a correlated update on 200 million >>>>>>> records. One UPDATE statement. >>>>>>> >>>>>>> Also, I'm not asking for a tutorial when not to use LOCK TABLES. I'm >>>>>>> trying >>>>>>> to figure out why, despite what the documentation says, using LOCK >>>>>>> TABLES >>>>>>> hinders performance for large update statements on MYISAM tables when >>>>>>> it is >>>>>>> supposed to increase performance on exactly the type of queries I am >>>>>>> performing. >>>>>>> >>>>>>> If you can't help answer *that* question, please stop lecturing me on >>>>>>> the >>>>>>> reasons not to use LOCK TABLES. Thanks. >>>>>>> >>>>>>> -Hank >>>>>>> >>>>>>> >>>>>>> On Thu, Sep 22, 2011 at 10:19 AM, Antony T Curtis >>>>>>> <antonycur...@verizon.net>wrote: >>>>>>> >>>>>>> > Even for MyISAM tables, LOCK TABLES is not usually the best >>>>>>> solution for >>>>>>> > increasing performance. When there is little to no contention, LOCK >>>>>>> TABLES >>>>>>> > doesn't offer much value. >>>>>>> > >>>>>>> > MyISAM works best when you can get more work done in a statement: >>>>>>> Instead >>>>>>> > of executing a bunch of insert statements, combine them into a >>>>>>> single >>>>>>> > multi-row insert statement, as an example. >>>>>>> > >>>>>>> > >>>>>>> > On 22 Sep 2011, at 06:13, Hank wrote: >>>>>>> > >>>>>>> > Thanks for your reply. I failed to mention that these are MYISAM >>>>>>> tables, >>>>>>> > so no transactions. And like I said, this is not a production box >>>>>>> nor is >>>>>>> > there any application running, so there's no contention for the >>>>>>> tables being >>>>>>> > locked. I'm trying to update a database design on two tables with >>>>>>> 200 >>>>>>> > million records each, so anything I can do to increase the >>>>>>> performance of >>>>>>> > these long running queries will shorten the migration running time. >>>>>>> > >>>>>>> > What I was referring to was that in the documentation, that when >>>>>>> using >>>>>>> > LOCK TABLES, mysql does not update the key cache until the lock is >>>>>>> released, >>>>>>> > versus when not using LOCK TABLES it does update the key cache on >>>>>>> each >>>>>>> > insert/update/delete. >>>>>>> > >>>>>>> > see: http://tuxradar.com/practicalphp/18/2/22 >>>>>>> > >>>>>>> > In my testing, I'm seeing a slow down when I use LOCK TABLES versus >>>>>>> running >>>>>>> > the same queries without it. I'm just trying to find a reason why >>>>>>> that >>>>>>> > might be the case. >>>>>>> > >>>>>>> > -Hank >>>>>>> > >>>>>>> > >>>>>>> > On Thu, Sep 22, 2011 at 12:42 AM, Antony T Curtis < >>>>>>> > antonycur...@verizon.net> wrote: >>>>>>> > >>>>>>> >> LOCK TABLES...WRITE is very likely to reduce performance if you >>>>>>> are using >>>>>>> >> a transactional storage engine, such as InnoDB/XtraDB or PBXT. The >>>>>>> reason is >>>>>>> >> that only one connection is holding the write lock and no other >>>>>>> concurrent >>>>>>> >> operation may occur on the table. >>>>>>> >> >>>>>>> >> LOCK TABLES is only really useful for non-transactional tables and >>>>>>> maybe a >>>>>>> >> few specialized operations where it has its advantages but for >>>>>>> 99.9% of >>>>>>> >> cases, it should not be used. >>>>>>> >> >>>>>>> >> What does increase performance is the proper use of transactions >>>>>>> with >>>>>>> >> appropriate use of SELECT...FOR UPDATE and SELECT...LOCK IN SHARE >>>>>>> MODE. >>>>>>> >> >>>>>>> >> Regards, >>>>>>> >> >>>>>>> >> Antony. >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> On 21 Sep 2011, at 20:34, Hank wrote: >>>>>>> >> >>>>>>> >> According to everything I've read, using LOCK TABLES...WRITE for >>>>>>> updates, >>>>>>> >>> inserts and deletes should improve performance of mysql server, >>>>>>> but I >>>>>>> >>> think >>>>>>> >>> I've been seeing the opposite effect. >>>>>>> >>> >>>>>>> >>> I've been doing quite a bit of testing on a 64bit install of >>>>>>> CentOS 5.5 >>>>>>> >>> installed as a guest OS on a VMWare ESXi 4.0 hypervisor on a Dell >>>>>>> R610. >>>>>>> >>> There are no other VMs on this box, and there are no other users >>>>>>> or >>>>>>> >>> threads >>>>>>> >>> running on the OS. Just me. I'm using this box strictly for >>>>>>> testing of >>>>>>> >>> large database migration scripts. >>>>>>> >>> >>>>>>> >>> It seems like when I execute some of these long running >>>>>>> statements >>>>>>> >>> without >>>>>>> >>> locking the tables, the code runs quite a bit faster than when I >>>>>>> do lock >>>>>>> >>> the >>>>>>> >>> tables. And before testing each run, I do restart the server so >>>>>>> there is >>>>>>> >>> no >>>>>>> >>> query caching and I also use FLUSH TABLES between each test run. >>>>>>> >>> >>>>>>> >>> All I'm asking is this: Can anything think of a scenario on a >>>>>>> single >>>>>>> >>> user-box and mysql instance, that locking tables would cause >>>>>>> these DML >>>>>>> >>> statements to slow down compared to not locking the tables? >>>>>>> >>> >>>>>>> >>> Thanks, >>>>>>> >>> >>>>>>> >>> -Hank >>>>>>> >>> >>>>>>> >> >>>>>>> >> >>>>>>> > >>>>>>> > >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >