Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > MySQL > MySQL General forum

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-24-2008, 06:08 PM
Krishna Chandra Prajapati
 
Posts: n/a
Default Table Design

Hi All,

Below is the table design on mysql server.

CREATE TABLE `coupon_per_course` (
`coupon_id` int(10) unsigned NOT NULL default '0',
`course_id` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`coupon_id`,`course_id`),
KEY `idx_coupon_per_course` (`coupon_id`),
KEY `idx_coupon_per_course_1` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

In my view index idx_coupon_per_course should not be there. Since coupon_id
is a primary key. so it will be utilized for searching.

Before removing index idx_coupon_per_course
mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
Query OK, 0 rows affected (0.06 sec)


After removing index idx_coupon_per_course
mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
Query OK, 0 rows affected (0.07 sec)

I am not able to understand why after removing the index
idx_coupon_per_course, it is taking more time. As it must take less time.

Some other statistics are
mysql> select count(*) from coupon_per_course;
+----------+
| count(*) |
+----------+
| 296218 |
+----------+
mysql> select count(distinct coupon_id) from coupon_per_course;
+---------------------------+
| count(distinct coupon_id) |
+---------------------------+
| 211519 |
+---------------------------+

Please suggest me the correct table design.
Thanks in advance.

Thanks,
--
Krishna Chandra Prajapati

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 04-24-2008, 06:08 PM
Rob Wultsch
 
Posts: n/a
Default Re: Table Design

On Thu, Apr 24, 2008 at 6:40 AM, Krishna Chandra Prajapati
<prajapatikc@gmail.com> wrote:
> Hi All,
>
> Below is the table design on mysql server.
>
> CREATE TABLE `coupon_per_course` (
> `coupon_id` int(10) unsigned NOT NULL default '0',
> `course_id` int(10) unsigned NOT NULL default '0',
> PRIMARY KEY (`coupon_id`,`course_id`),
> KEY `idx_coupon_per_course` (`coupon_id`),
> KEY `idx_coupon_per_course_1` (`course_id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
>
> In my view index idx_coupon_per_course should not be there. Since coupon_id
> is a primary key. so it will be utilized for searching.
>
> Before removing index idx_coupon_per_course
> mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
> and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> Query OK, 0 rows affected (0.06 sec)
>
>
> After removing index idx_coupon_per_course
> mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
> and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> Query OK, 0 rows affected (0.07 sec)
>
> I am not able to understand why after removing the index
> idx_coupon_per_course, it is taking more time. As it must take less time.
>
> Some other statistics are
> mysql> select count(*) from coupon_per_course;
> +----------+
> | count(*) |
> +----------+
> | 296218 |
> +----------+
> mysql> select count(distinct coupon_id) from coupon_per_course;
> +---------------------------+
> | count(distinct coupon_id) |
> +---------------------------+
> | 211519 |
> +---------------------------+
>
> Please suggest me the correct table design.
> Thanks in advance.
>
> Thanks,
> --
> Krishna Chandra Prajapati
>

Hi Krishna,
I have run into similar issues in the past and have ended up having
duplicative indexes. The multi column indexes have higher cardinality
and although it should not be an issue, lookup on the first portion of
the index alone is not as efficient. I would love to know why this
is/what I am dong wrong.

Are you having issues with INSERT speed, or the size of the your indexes?

Posting your explain (extended) and show index may be helpful.

For whatever it is worth, I always suggest explicit joins and using AS:
SELECT sql_no_cache ac.plan
FROM coupon_per_course AS cpc
INNER JOIN affiliate_coupon AS ac USING(coupon_id)
WHERE cpc.course_id = 213336
AND ac.coupon_code='TST0G0'

I think it makes queries much easier to read and understand.

--
Rob Wultsch
wultsch@gmail.com
wultsch (aim)
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 04-29-2008, 08:26 PM
Krishna Chandra Prajapati
 
Posts: n/a
Default Re: Table Design

Hi wultsch,

Thanks a lot.
Every thing is going fine. I am only concerned with duplicate index, as it
is using disk space.

Is there any solution so that i can ignore duplicate index by altering the
table design. OR i have to end up with duplicate index.

Thanks,
Krishna Chandra Prajapati

On Thu, Apr 24, 2008 at 9:27 PM, Rob Wultsch <wultsch@gmail.com> wrote:

> On Thu, Apr 24, 2008 at 6:40 AM, Krishna Chandra Prajapati
> <prajapatikc@gmail.com> wrote:
> > Hi All,
> >
> > Below is the table design on mysql server.
> >
> > CREATE TABLE `coupon_per_course` (
> > `coupon_id` int(10) unsigned NOT NULL default '0',
> > `course_id` int(10) unsigned NOT NULL default '0',
> > PRIMARY KEY (`coupon_id`,`course_id`),
> > KEY `idx_coupon_per_course` (`coupon_id`),
> > KEY `idx_coupon_per_course_1` (`course_id`)
> > ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
> >
> > In my view index idx_coupon_per_course should not be there. Since

> coupon_id
> > is a primary key. so it will be utilized for searching.
> >
> > Before removing index idx_coupon_per_course
> > mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> > affiliate_coupon ac, coupon_per_course cpc where

> ac.coupon_code='TST0G0'
> > and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> > Query OK, 0 rows affected (0.06 sec)
> >
> >
> > After removing index idx_coupon_per_course
> > mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> > affiliate_coupon ac, coupon_per_course cpc where

> ac.coupon_code='TST0G0'
> > and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> > Query OK, 0 rows affected (0.07 sec)
> >
> > I am not able to understand why after removing the index
> > idx_coupon_per_course, it is taking more time. As it must take less

> time.
> >
> > Some other statistics are
> > mysql> select count(*) from coupon_per_course;
> > +----------+
> > | count(*) |
> > +----------+
> > | 296218 |
> > +----------+
> > mysql> select count(distinct coupon_id) from coupon_per_course;
> > +---------------------------+
> > | count(distinct coupon_id) |
> > +---------------------------+
> > | 211519 |
> > +---------------------------+
> >
> > Please suggest me the correct table design.
> > Thanks in advance.
> >
> > Thanks,
> > --
> > Krishna Chandra Prajapati
> >

> Hi Krishna,
> I have run into similar issues in the past and have ended up having
> duplicative indexes. The multi column indexes have higher cardinality
> and although it should not be an issue, lookup on the first portion of
> the index alone is not as efficient. I would love to know why this
> is/what I am dong wrong.
>
> Are you having issues with INSERT speed, or the size of the your indexes?
>
> Posting your explain (extended) and show index may be helpful.
>
> For whatever it is worth, I always suggest explicit joins and using AS:
> SELECT sql_no_cache ac.plan
> FROM coupon_per_course AS cpc
> INNER JOIN affiliate_coupon AS ac USING(coupon_id)
> WHERE cpc.course_id = 213336
> AND ac.coupon_code='TST0G0'
>
> I think it makes queries much easier to read and understand.
>
> --
> Rob Wultsch
> wultsch@gmail.com
> wultsch (aim)
>




--
Krishna Chandra Prajapati

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 04-29-2008, 08:26 PM
Sebastian Mendel
 
Posts: n/a
Default Re: Table Design

Krishna Chandra Prajapati schrieb:
> Hi All,
>
> Below is the table design on mysql server.
>
> CREATE TABLE `coupon_per_course` (
> `coupon_id` int(10) unsigned NOT NULL default '0',
> `course_id` int(10) unsigned NOT NULL default '0',
> PRIMARY KEY (`coupon_id`,`course_id`),
> KEY `idx_coupon_per_course` (`coupon_id`),
> KEY `idx_coupon_per_course_1` (`course_id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
>
> In my view index idx_coupon_per_course should not be there. Since coupon_id
> is a primary key. so it will be utilized for searching.
>
> Before removing index idx_coupon_per_course
> mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
> and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> Query OK, 0 rows affected (0.06 sec)
>
>
> After removing index idx_coupon_per_course
> mysql> do benchmark(1000000,(select sql_no_cache ac.plan from
> affiliate_coupon ac, coupon_per_course cpc where ac.coupon_code='TST0G0'
> and ac.coupon_id = cpc.coupon_id and cpc.course_id = 213336));
> Query OK, 0 rows affected (0.07 sec)
>
> I am not able to understand why after removing the index
> idx_coupon_per_course, it is taking more time. As it must take less time.
>
> Some other statistics are
> mysql> select count(*) from coupon_per_course;
> +----------+
> | count(*) |
> +----------+
> | 296218 |
> +----------+
> mysql> select count(distinct coupon_id) from coupon_per_course;
> +---------------------------+
> | count(distinct coupon_id) |
> +---------------------------+
> | 211519 |
> +---------------------------+


as you can see above, is the PRIMARY KEY(`coupon_id`,`course_id`) not only
larger caused by having two fields indexed, also by having more index entries

so it seems not unusual to me that it takes more time to search this index ...

--
Sebastian Mendel
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 07:07 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145