The problem is in how you do the query, the partitions work.
When you do
explain partitions select * from log_tests
where unix_timestamp(`timestamp`) < unix_timestamp('2014-01-31 00:00:00')
you are applying a function to a column value. Always when applying a function to a column MySQL is forced to do a full table scan as all rows need to apply that function to be able to evaluate the expression. It might be easier to understand it if you think of the function rand()
instead, then it's obvious that each row has to be evaluated.
If you change your query to
explain partitions select * from log_tests
where timestamp < '2014-01-31 00:00:00';
it correctly uses only one partition. See this fiddle.
Btw, this holds true for all queries, not only those on partitioned tables. You should never apply functions to the column value, it will do a full table scan each time.