HiveBrain v1.2.0
Get Started
← Back to all entries
patternsqlMinor

INNER JOIN Giving time out on large database

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
timejoindatabaselargeinnergivingout

Problem

Getting time out on this script

UPDATE 
    uk_data AS ud
  INNER JOIN 
    uk_pc AS up 
        ON ud.cat10 = up.WardCode
SET 
    ud.cat8 = up.Latitude,
    ud.cat9 = up.Longitude;


uk_pc Table has 1,755,213 entries and uk_data has 24,510 entries.

Is there any other way to do this where I don't get time out?

I want to update uk_data cat8 and cat9 with uk_pc Latitude and Longitude.

Table1:  uk_pc
    Latitude
    Longitude
    WardCode

Table2:  uk_data
    cat8
    cat9
    cat10


in both tables WardCode and cat10 have same value.

Table Definitions

Table1 uk_data

CREATE TABLE IF NOT EXISTS `uk_data` (
  `slno` int(100) NOT NULL AUTO_INCREMENT,
  `comp_name` varchar(150) DEFAULT NULL,
  `comp_no` varchar(50) DEFAULT NULL,
  `comp_street` varchar(100) DEFAULT NULL,
  `comp_area` varchar(100) DEFAULT NULL,
  `comp_post_code` varchar(50) DEFAULT NULL,
  `comp_phone` varchar(100) DEFAULT NULL,
  `comp_phone1` varchar(100) DEFAULT NULL,
  `cat1` varchar(100) DEFAULT NULL,
  `cat2` varchar(100) DEFAULT NULL,
  `cat3` varchar(100) DEFAULT NULL,
  `cat4` varchar(100) DEFAULT NULL,
  `cat5` varchar(100) DEFAULT NULL,
  `cat6` varchar(100) DEFAULT NULL,
  `cat7` varchar(100) DEFAULT NULL,
  `cat8` varchar(100) DEFAULT NULL,
  `cat9` varchar(100) DEFAULT NULL,
  `cat10` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`slno`),
  UNIQUE KEY `Phone` (`comp_phone`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=31717 ;


Table2(uk_pc)

``
DROP TABLE IF EXISTS
uk_pc;
CREATE TABLE
uk_pc (
slno int(11) NOT NULL AUTO_INCREMENT,
Postcode varchar(25) DEFAULT NULL,
Latitude
Latitude decimal(9,6) DEFAULT NULL,
Longitude decimal(9,6) DEFAULT NULL,
Easting varchar(25) DEFAULT NULL,
Northing varchar(25) DEFAULT NULL,
GridRef varchar(25) DEFAULT NULL,
County varchar(25) DEFAULT NULL,
District varchar(25) DEFAULT NULL,
Ward varchar(25) DEFAULT NULL,
DistrictCode varchar(25) DEFAULT NULL,
Wa

Solution

At the very least, you should have an index on WardCode on uk_pc. If you also add Latitude and Longitude it will become covering for this query and so the table will not need to be used at all.

Your datatypes aren't really the most efficient, so I'd definitely revisit your table designs. narrower columns (Latitude and Longitude are better off as decimal and would never be 100 characters long) will store better in the tables (and of course in the indexes as well). The width of varchar columns might seem to be something you don't neet to worry about, but it does affect what the database engine sets aside while performing queries since it does not know if it will encounter larger strings in the data. In general, limiting the working set like this can only help, especially when it is easily foreseeable.

Context

StackExchange Database Administrators Q#31228, answer score: 7

Revisions (0)

No revisions yet.