title: How to store URLs in MySQL
body: <p>I need to store potentially 100s of millions URLs in a database. Every URL should be unique, hence I will use ON DUPLICATE KEY UPDATE and count the duplicate URLs.</p>
  
  <p>However, I am not able to create an index on the URL field as my varchar field is 400 characters. MySQL is complaining and saying; "#1071 - Specified key was too long; max key length is 767 bytes". (Varchar 400 will take 1200 bytes)</p>
  
  <p>What is the best way to do this, if you need to process minimum 500000 URLs per day in a single server?</p>
  
  <p>We are already thinking using MongoDB for the same application, so we can simply query MongoDB and find the duplicate URL, and update the row. However, I am not in favor of solving this problem using MongoDB , and I'd like to use just MySQL at this stage as I'd like to be as lean as possible in the beginning and finish this section of the project much faster. (We haven't played with MongoDB yet and don't want to spend time at this stage)</p>
  
  <p>Is there any other possibility doing this using less resources and time. I was thinking to get MD5 hash of the URL and store it as well. And I can make that field UNIQUE instead. I know, there will be collision but it is ok to have 5-10-20 duplicates in the 100 million URLs, if that's the only problem.</p>
  
  <p>Do you have any suggestions? I also don't want to spend 10 seconds to insert just one URL, as it will process 500k URLs per day.</p>
  
  <p>What would you suggest?</p>
  
  <p>Edit: As per the request this is the table definition. (I am not using MD5 at the moment, it is for testing)</p>
  
  <pre><code>mysql&gt; DESC url;
  +-------------+-----------------------+------+-----+-------------------+-----------------------------+
  | Field       | Type                  | Null | Key | Default           | Extra                       |
  +-------------+-----------------------+------+-----+-------------------+-----------------------------+
  | url_id      | int(11) unsigned      | NO   | PRI | NULL              | auto_increment              |
  | url_text    | varchar(400)          | NO   |     |                   |                             |
  | md5         | varchar(32)           | NO   | UNI |                   |                             |
  | insert_date | timestamp             | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
  | count       | mediumint(9) unsigned | NO   |     | 0                 |                             |
  +-------------+-----------------------+------+-----+-------------------+-----------------------------+
  5 rows in set (0.00 sec)
  </code></pre>