Best of Google homepage logos over the years

Google modifies their home page by including birthdays of some major personalities around the world or major events. Here are some of the best, unique and presented in more than one country. The list below is not any particular order.

2009.05.20 – Charles Darwin Birthday

2009.11.13 – Water on Moon found

2009.10.02 – Mahatma Gandhi

1998.10.29 – Google Beta

1998.08.30 – Burning Man (One of the first of Google’s modified logos!)

2006.01.04 – Louis Braille’s Birthday

2008.05.16 – Laser Invention

2009.10.07 – Barcode Invention

2003.03.14 – Einstein’s Birthday

2006.02.11 – Olympics Snowboarding

2007.04.22 – Earth Day

2005.04.15 – Leonardo Da Vinci Birthday

2008.11.04 – US Election Day

2009.05.20 – Darwinius Masillae

2009.01.28 – Jackson Pollock Birthday

2002.05.20 through 24 – Dilbert Comics


2005.03.30 – Van Gogh’s Birthday

2006.12.12 – Edvard Munch Birthday

2008.06.06 – Diego Velazquez’s Birthday

2007.04.01 – April Fool Day   — (TiSP)

2009.02.12 – Samuel Morse Birthday

2004.02.03 – Gaston Julia’s Birthday


2009.10.29 – Asterix Comic’s 50th Anniversary

2008.01.28 – 50th Annivesary of the LEGO Brick

2009.10.31 – Happy Halloween

2008.01.01 – 25 Years of TCP/IP protocol

Introduction and using MySQL Explain

Like in any database query optimization is critical for MySQL data warehouse environment and having a better understanding of the “Explain plan” helps the database application developer avoiding issues with query  performance. Also, DBAs will like your queries and they would be more than happy to help you optimize them.

MySQL’s “Explain” statement provides details on query parsing and execution steps and outputs 10 fields –
id, select_type, table, type, possible_keys, key, key_len, ref, rows and Extra columns.

You run the statement by issuing

explain  #-- Insert your query between . 

Shown below is the Toad’s output of explain plan of a self-joined table’s query with where clause. The table has around 20million rows. The query took less than 0.6seconds to index through ~70K rows and with “const” and a func (date_add function) to compare between one days data to its previous day data.

SELECT a.ad_date, a.unit_id, a.max_cpc, 
SUM(coalesce(a.max_cpc, a.max_cpc) - coalesce(b.max_cpc, a.max_cpc)) diff_cpc
FROM sem_kw_summary a
LEFT JOIN sem_kw_summary b
ON date_add(a.ad_date, INTERVAL -1 day) = b.ad_date
AND a.unit_id = b.unit_id
WHERE date_add(CURRENT_DATE, INTERVAL -1 day) = a.ad_date
AND a.engine = 'google'
GROUP BY a.ad_date, a.unit_id

The most important columns that you should look are “type”, “key_len”, “ref” and “rows”.  They quickly help you concentrate your tuning effort.

Column Column details
id An identifier and a sequential number of each selection within the query.
selecty_type A “type of select” with 9 possible values from simple to more complex type like derived, uncachable subquery, etc. Correlated subqueries are very costly in MySQL and avoid them.
table Name of the table or alias it is referring.
type A join or data access type. Can have 12 values like const, system, ref, eq_ref, etc. Full table scan happens when the value is “ALL” and try avoiding it. For fast performing queries you should see “const or system or eq_ref or ref”.
possible_keys Many possible keys that could be of use in this query (join).
key One of the many keys from possible_keys. A key can be composite key.
key_len Length of each key (in bytes). Smaller the key_len better it is for performance.
ref The columns that will be compared to the index in key column above.
rows Number of rows engine has to examine. It is an estimate. I wish it was a percentage of table size in rows. Obviously, smaller number is better.
Extra Can have many values and provides more details on the explain plan. Typically, “using index, using where” are good and don’t be confused with when you see “using filesort” – it does not mean MySQL will use file transferring data between main memory and disk. Filesort is a type of sort with an extra pass needed to retrieve the data.

For more details see