Home » Performance » MySQL » Any suggestions to tackle a slow query on a large table with composite PK?
Any suggestions to tackle a slow query on a large table with composite PK? [message #1998] Fri, 05 October 2007 14:48 Go to previous message
JGilbert  is currently offline JGilbert
Messages: 31
Registered: May 2007
Location: Chicago, IL
Member

Actual query:
SELECT SQL_NO_CACHE country_abbreviation, country_name, region, city, isp, latitude, longitude FROM ip2location WHERE ip_first <= 3335238065 AND ip_last >= 3335238065; 4.6 seconds

Profile:
Status	Time
(initialization)	0.000004
checking query cache for query	0.000073
Opening tables	0.000014
System lock	0.000022
Table lock	0.00001
init	0.000032
optimizing	0.000015
statistics	0.000213
preparing	0.000131
executing	0.000011
Sending data	4.651696 <--- What? it's 1 record
end	0.000047
query end	0.000008
freeing items	0.000019
closing tables	0.000011
logging slow query	0.000004

Explain:
1	SIMPLE	ip2location	range	PRIMARY,ip_last,ip_first	PRIMARY	4	NULL	1886656	Using where

Research:
SELECT SQL_NO_CACHE ip_first FROM ip2location WHERE ip_last >= 3335238065; .0007 seconds
SELECT SQL_NO_CACHE ip_last FROM ip2location WHERE ip_first <= 3335238065; .0007 seconds
SELECT SQL_NO_CACHE count(ip_last) FROM ip2location WHERE ip_first <=3335238065; 2,251,823 rows (1.3 seconds)
SELECT SQL_NO_CACHE count(ip_first) FROM ip2location WHERE ip_last >= 3335238065; 1,406,113 rows (.65 seconds)
SELECT SQL_NO_CACHE max(ip_first) AS first_max FROM ip2location WHERE ip_last >= 3335238065; 4278190080 (1 second)
SELECT SQL_NO_CACHE min(ip_first) AS first_min FROM ip2location WHERE ip_last >= 3335238065; 3335237632 (.69 seconds)
SELECT SQL_NO_CACHE max(ip_last) AS last_max FROM ip2location WHERE ip_first <= 3335238065; 3335239167 (1.4 seconds)
SELECT SQL_NO_CACHE min(ip_last) AS last_min FROM ip2location WHERE ip_first <= 3335238065; 33996343 (1.37 seconds)


The table itself has a composite PK on ip_first and ip_last. I wasn't sure if it was not correctly using the keys because it was a composite, so i added a normal index on both ip_last and ip_first separately. Initially I thought I saw a 2-4 second improvement in query performance, however, that was months ago. to my knowledge queries like this have not ever run under 4 seconds though. This is a query which runs when someone first visits the site which causes a 5-10 second delay in some cases. It would be great if I could find a way to tune this down somehow to around or below 1 second.

Thanks in advance for any help!

Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic:Advice pls my.cnf settings for my system
Next Topic:Changing datatypes of foreign keys
Goto Forum:

  


Current Time: Sun Jul 5 17:58:06 EDT 2009

Total time taken to generate the page: 0.01305 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 2.7.7.
Copyright ©2001-2007 FUD Forum Bulletin Board Software

MySQL is a trademark of Sun Microsystems.
InnoDB is a trademark of Oracle Corp.

Percona Performance Forums are a service of Percona, Inc.
Not affiliated with Sun Microsystems or Oracle Corp.