Question on MySQL Partitioning
Any range (eg month&gt;8 or month BETWEEN 8 AND 12) leads to punting on partition pruning, hence 77 partitions are selected.  That is, PARTITION BY HASH is useless for ranges.  Meanwhile, non-partitioning is excellent for the other type of queries -- "point queries".  So don't bother using BY HASH!

Where does id come from?  Typically it is an AUTO_INCREMENT, but apparently not for your table.

select count(*) from emp where gen_year=1984 and month=8;


can be significantly sped up by


Storing date1 as either a TIMESTAMP or DATETIME.  With fractional seconds if needed.
Adding INDEX(date1)
Writing the query thus:

SELECT COUNT(*) FROM EMP
     WHERE date1 &gt;= '1984-08-01'
       AND date1  &lt; '1984-08-01' + INTERVAL 1 MONTH


If you build and maintain a Summary table, then the query becomes 'instantaneous', and even the other query will be faster than

     WHERE date1 &gt;= '1984-09-01'
       AND date1  &lt; '1985-01-01'


InnoDB really needs a PRIMARY KEY.  Promote the UNIQUE key to primary.  (Though I have serious doubts about that index.)

These are all "range" tests:  BETWEEN, &gt;=, &lt;.  All may work well with non-partitioned tables, but fail miserably on PARTITION BY HASH tables (when the range involves the partition-key).