First of all, changing action to INT(2) vs INT(11) takes the same space {# inside ()'s is for display purposes not storage} on disk {I think it's 4 bytes, but would have to look it up}. TINYINT or maybe even ENUM {my preference} would only take 1 byte and would serve your purpose.
You could make details a 2nd table joined with the id field in earnings. This complicates your code somewhat, but does save the space. The size issue isn't a # of records issue but more of a max file size on the OS of your server. If your server OS only supports a max file size of 2GB and you are using MyISAM then you will hit this limit way before you have to worry about # of rows. There is a max # rows variable in my.cnf, but it is usually set very large. You might want to consider using MERGE or UNION if you never delete any records {See Manual}. This gets around the OS size issue and with MyISAMPACK and MERGE could make queries against on the whole data set run much faster. Gordon Bruce Interstate Software A MySQL Training & Consulting Partner > -----Original Message----- > From: Daren [mailto:[EMAIL PROTECTED]] > Sent: Tuesday, July 23, 2002 4:45 AM > To: [EMAIL PROTECTED] > Subject: Table Design > > > > > First off, this post is going to be long :) > > I have designed a database that tracks member earnings on the site. > Currently, the site has been operating for two weeks, has 10,000 members, > and the earnings table already has 750,000 rows. I ran a query to see how > many rows were being added each day, and it is growing exponentially. > I.e., 5 days ago, 60,000 rows were added, yesterday, 100,000 rows were > added. > > Before I explain why the table is growing so quickly, some background: > > Members are paid to read emails, click banners, etc. They are also paid > when one of their direct referrals (a member who signed up under their > referral URL) reads an email or clicks a banner, or when their indirect > referrals (a member who signs up under one of their referrals' referral > URL) reads an email or clicks a banner. Therefore, each time an email is > read or a banner is clicked, 3 rows are added to the earnings table. This > table also keeps track of misc earnings, such as signup bonuses, referral > bonuses, etc. I designed it this way because if the site ever wants to add > on (say, pay their members to search the web), the table does not need to > be modified at all. > > So, now it's obvious why the table is growing so rapidly. So far, the size > of the table is not a problem. The site is run on a dedicated server, so > physical file size will probably never be a problem (maybe it will?). With > 750,000 rows, the current file size is about 70mb. Also, since the table > is indexed properly, queries are running smoothly, and I also do not think > that should ever become a problem. However, data from this table will > never be deleted, so it is just going to continue growing forever. With > 100,000 members to the site instead of 10,000, this table will grow by > millions of rows each day. > > My question: Can MySQL handle a table with tens or hundreds of millions of > rows? > > Here is the design of the table: > > CREATE TABLE earnings ( > id int(9) unsigned NOT NULL auto_increment, > member_id int(8) unsigned NOT NULL default '0', > action varchar(50) NOT NULL default '', > details varchar(100) default NULL, > amount decimal(7,3) NOT NULL default '0.000', > time timestamp(14) NOT NULL, > paid enum('N','Y') NOT NULL default 'N', > PRIMARY KEY (id), > KEY earnings_member_id(member_id) > ) TYPE=MyISAM; > > I have played around with some possible "reconstruction" of this table to > see the results. > > 1) Removing the details column alltogether cuts the physical size of the > table to 70% of the original. Only about 5% of all the rows in this table > use the details field, but the 5% that do use it absolutely require it. So > this really isn't much of an option, but the 95% of rows that are not > using this field are really wasting space. Is there some other way to > accomplish this? > > 2) Modifying the action field from varchar(35) to int(2). Since there are > only about 15 different actions (Banner Clicked, Banner Clicked by Direct > Referral, etc), I could create a new table with all the actions, and then > simply store the foreign key in the earnings table. This also cuts the > physical file size down to 70% that of the original. > > However, physical file size (at least I think) is not really the issue > here, the issue is the number of rows in the table, and neither of the > above solutions help with this. The only other solution I have come up > with, is the following: > > 1) Create a table with the following fields: > member_id, # of banners clicked, amount from banners clicked, # of banners > clicked by direct referral, amount from banners clicked by direct > referral, etc, etc. This would require 12 fields just for banners clicked > and emails read, and is certainly not a "good" way of doing things (I > would think anyway). Then, I would have another earnings table in addition > to this one which tracked misc earnings, such as signup bonuses, referral > bonuses, and any other future addons the site may have. That way, I keep > the advantages of what I have now, and I sacrifice little. (What I > sacrifice is the ability to view a list of every single earnings credited > to a members account. Instead, I only have the total # of banners clicked, > and the total amount earned from that...I don't have a list of all banners > clicked, etc). > > The method explained above would require a *LOT* of recoding, and I > certainly don't wish to spend the time if it's not even the best way of > doing things. If anyone has any ideas as to a good way of resolving this > issue, I'd greatly appreciate it! I am fully willing to pay someone for > consulting services if they can present to me a good solution to this > problem! > > Filter: SQL, Query > > > ------------------------------------------------ > Join Excite! - http://www.excite.com > The most personalized portal on the Web! > > --------------------------------------------------------------------- > Before posting, please check: > http://www.mysql.com/manual.php (the manual) > http://lists.mysql.com/ (the list archive) > > To request this thread, e-mail <[EMAIL PROTECTED]> > To unsubscribe, e-mail <mysql-unsubscribe- > [EMAIL PROTECTED]> > Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php