Flite Careers

Testing MySQL FULLTEXT Indexes in InnoDB Using Pt-upgrade

As I prepare to convert some MySQL tables with FULLTEXT indexes from MyISAM to InnoDB I want to verify that running a standard production query set against the tables will return the same results with InnoDB that it did with MyISAM. Since I read Matt Lord’s blog post about the document relevancy rankings used for InnoDB full-text searches I knew to expect some differences when sorting by relevancy, so I want to focus on getting the same set of rows back, mostly ignoring the order in which the rows are returned.

Percona toolkit has a tool called pt-upgrade that works well for this purpose. I used 2 test servers with a copy of my production database. On one of the servers I left the tables in MyISAM, and on the other I converted the tables to InnoDB. I copied a slow query log from a production host running with long_query_time=0 to get the query set for testing. Since I was only interested in queries on a few tables, rather than running the entire slow query log against the servers I just extracted the specific queries I was interested in and ran them as a raw log.

Here’s the command I used:

pt-upgrade --read-only \
  --database flite \
  --type rawlog /tmp/proddb-slow.log.raw \
  h=testdb33.flite.com \

I used the --read-only flag so pt-upgrade would only execute SELECT statements, and not any statements that modify data.

Since I extracted the SQL queries from the slow query log instead of using the full slow query log, I used --type rawlog instead of the default of --type slowlog.

For the two hosts I compared, testdb33 is using FULLTEXT on InnoDB, and testdb47 is using FULLTEXT on MyISAM.

When I ran pt-upgrade it exposed several significant discrepancies. I will document those discrepancies and how I fixed them in a future post.