Thanks, Jay.
Comments interspersed...
> Jerry Schwartz wrote:
> > I need (ultimately) to update some prices in a prod_price
> table. First, I
> > need to locate a product and its associated prices using a field
> > prod.prod_price_prod_id which is not unique, and is often
> null, but it is
> > indexed. (Subsequent operations will use PRIMARY keys, but
> I haven't gotten
> > there yet.) I further qualify a product by an associated
> pub.pub_code, to
> > weed out possible duplicate prod_pub_prod_id entries from different
> > publisher.
>
> Good... I would move to lookups/joins on a primary key ASAP
> for performance.
I don't see where I have any choices about the keys that I use. Every table
uses a primary key of the form "tablename_id", and is linked to at least one
other table (usually prod) by a field storing the primary key of the other
table. So prod_price has a primary key of prod_price_id, and has a field
prod_id that links it back to the prod table. The relationship of prod to
prod_price is 1:many. The link between pub and prod is similar, with the
relationship between pub and prod also being 1:many.
>
> > My SELECT statement is
> >
> > SELECT SQL_CALC_FOUND_ROWS prod.prod_num,
> > prod_price.prod_price_end_curr,
> > prod_price.prod_price_end_price,
> > prod_price.prod_price_disp_curr,
> > prod_price.prod_price_disp_price
> > FROM pub JOIN prod JOIN prod_price
> > WHERE pub.pub_id = prod.pub_id
> > AND pub.pub_code IN ("ener","fit","govt","heal","id","life","manu")
> > AND prod.prod_id = prod_price.prod_id
> > AND prod.prod_pub_prod_id = "101771"
> > AND prod_price.prod_price_disp_curr = 'USD'
> > AND prod_price.prod_price_end_curr = 'USD';
> >
> > An EXPLAIN of this query looks pretty good:
> >
> > *************************** 1. row ***************************
> > id: 1
> > select_type: SIMPLE
> > table: prod
> > type: ref
> > possible_keys: PRIMARY,pub_id,prod_pub_prod_id
> > key: prod_pub_prod_id
> > key_len: 766
>
> Whoooaaahhh.... is it really a 766-byte-wide key? That's
> going to kill you.
I don't know where that 766 is coming from, the actual field is a
varchar(15) for all of the keys.
>
> > ref: const
> > rows: 2
> > Extra: Using where
> > *************************** 2. row ***************************
> > id: 1
> > select_type: SIMPLE
> > table: pub
> > type: eq_ref
> > possible_keys: PRIMARY
> > key: PRIMARY
> > key_len: 45
>
> Same here. 45-byte-wide PK is a killer.
>
> > ref: giiexpr_db.prod.pub_id
> > rows: 1
> > Extra: Using where
> > *************************** 3. row ***************************
> > id: 1
> > select_type: SIMPLE
> > table: prod_price
> > type: ref
> > possible_keys: prod_id
> > key: prod_id
> > key_len: 46
>
> Same
>
> > ref: giiexpr_db.prod.prod_id
> > rows: 2
> > Extra: Using where*************************** 1. row
> > ***************************
> > id: 1
> > select_type: SIMPLE
> > table: prod
> > type: ref
> > possible_keys: PRIMARY,pub_id,prod_pub_prod_id
> > key: prod_pub_prod_id
> > key_len: 766
>
> Same
>
>
> > ref: const
> > rows: 2
> > Extra: Using where
> > *************************** 2. row ***************************
> > id: 1
> > select_type: SIMPLE
> > table: pub
> > type: eq_ref
> > possible_keys: PRIMARY
> > key: PRIMARY
> > key_len: 45
> > ref: giiexpr_db.prod.pub_id
> > rows: 1
> > Extra: Using where
> > *************************** 3. row ***************************
> > id: 1
> > select_type: SIMPLE
> > table: prod_price
> > type: ref
> > possible_keys: prod_id
> > key: prod_id
> > key_len: 46
> > ref: giiexpr_db.prod.prod_id
> > rows: 2
> > Extra: Using where
> >
> > As you can see, if first retrieves the (possibly multiple)
> prod records
> > based upon the prod_pub_prod_id, which is keyed. Then it
> hops over to the
> > pub table using the common pub_id field, which is the
> PRIMARY key in the pub
> > table, so it can check my IN condition. Finally, it picks
> up (possibly
> > multiple) prod_price records using the common field prod_id.
> >
> > The optimization seems pretty good. A single execution of
> this query, using
> > the CI MySQL, is reported to take .05 seconds.
> Unfortunately, I have about
> > 20,000 products to process; so at a minimum I would expect
> it to take 1,000
> > seconds. Even ignoring the overhead from PHP, this is going
> to run for
> > awhile.
> >
> > Does anyone have any suggestions for improving my code?
> >
> > Regards,
> >
> > Jerry Schwartz
> > Global Information Incorporated
> > 195 Farmington Ave.
> > Farmington, CT 06032
> >
> > 860.674.8796 / FAX: 860.674.8341
> >
> >
> >
> >
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:
> http://lists.mysql.com/[EMAIL PROTECTED]
>
>
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]