Did you really mean to have start/end_date in both tables?  Are the values 
identical?  If they are, that is another reason to use an INT UNSIGNED 
AUTO_INCREMENT.

Done correctly, JOIN can usually run faster than two separate queries.

SELECT  d.*
    FROM  item_detail AS d
    JOIN  item_spine AS s ON d.guid = s.guid
    WHERE  s.guid = '$guid'
      AND  s.start_date <= NOW()
      AND  s.end_date >= NOW()
      AND  s.location_code = '$query'
      AND  d.start_date <= NOW()
      AND  d.end_date >= NOW()
    ORDER BY  d.sequence 

Also, the value of NOW() could be different between the two queries; it will be 
the same in the JOIN verison.

Does it need to say
  s.start_date = d.start_date AND s.end_date = d.end_date ?

I would recommend InnoDB, at least for recovery after a crash.  PRIMARY KEYs 
are handled differently between the engines, but I don't have enough details of 
your app to explain relevant details.

Do you expect to get more than 1 guid from first query?  Multiple rows from 
second query?

item_spline needs an index beginning with location_code.
item_detail _might_ benefit from INDEX(guid, sequence).

> -----Original Message-----
> From: Mark Goodge [mailto:m...@good-stuff.co.uk]
> Sent: Monday, July 16, 2012 10:13 AM
> To: Mysql General List
> Subject: Re: Unique index - opinions sought
> 
> On 16/07/2012 17:39, Rick James wrote:
> > How many rows?  If 1K, it does not matter.   If 1 billion, we need to
> > discuss in more detail.  Let's assume 1M...
> 
> Around 1M in the item_spine table and 10M in item_detail.
> 
> > Dates should be stored in DATE datatype, which is 3 bytes. Your GUID
> > is non-standard, but should probably be stored in CHAR(6) CHARACTER
> > SET ascii, unless it is expected to have non-ascii characters.  Is
> > case folding important? Given those, the PRIMARY KEY is 6+3+3=12
> bytes
> > long.  This is not bad for a million-row table.  If bigger, then the
> > AUTO_INCREMENT should be considered.
> 
> The guid is case-insensitive. ISO dates map directly to MySQL's
> internal DATE type, so that's already taken care of. All data is ascii,
> and all alpha data is not case-sensitive.
> 
> I should maybe have mentioned earlier that this is external data over
> which I have no control (but do have a specification which I expect to
> be honoured).  My task is to store it and make it searchable for
> display.
> 
> > Is this InnoDB or MyISAM?  (Please provide SHOW CREATE TABLE, not
> > English, for describing tables.)
> 
> It's MyISAM. I don't actually have a CREATE yet, as this is still just
> hypothetical :-)
> 
> > Let's see the SELECTs that will be hitting the tables.  Then we can
> > discuss in more detail.
> 
> A typical select would be something like this:
> 
> SELECT guid
> FROM item_spine
> WHERE start_date <= NOW()
> AND end_date >= NOW()
> AND location_code = '$query'
> 
> followed by
> 
> SELECT *
> FROM item_detail
> WHERE guid = '$guid'
> AND start_date <= NOW()
> AND end_date >= NOW()
> ORDER BY sequence
> 
> where $query is the initial query from the user and $guid is the result
> of the first query. location_code is VARCHAR(10) and is an alphanumeric
> string.
> 
> (I'm avoiding joins because doing multiple selects in the code is
> usually much faster)
> 
> Mark
> 
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/mysql


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql

Reply via email to