Extract names from another table
The (possibly) most efficient way, first group, then join:

SELECT
    product_name, c
FROM
    (
      SELECT product_id, COUNT(*) AS c
      FROM order_details
      GROUP BY product_id
    ) AS counts
    /* The trick is now to JOIN this virtual table with your product table */
    JOIN product p ON p.product_id = counts.product_id
ORDER BY 
    c DESC ;


You can check that it works in this SQL Fiddle (scaled by a 10 factor). 

This SQL is very close to standard, so it should work not only with MySQL, but with most SQL databases (I've tested it with MySQL, PostgreSQL and SQLite).



Most contemporary databases will probably execute the following query with the same efficiency, provided that NOT NULL and REFERENCES are in place (and you type a bit less, and probably make it easier to understand):

SELECT 
    p.product_name, COUNT(*) AS c
FROM 
    order_details od
    JOIN product p ON p.product_id = od.product_id
GROUP BY 
    p.product_id
ORDER BY 
    count(*) DESC ;


Or, without using aliases:

SELECT 
    product.product_name, COUNT(*) AS c
FROM 
    order_details
    JOIN product ON product.product_id = order_details.product_id
GROUP BY 
    product.product_id
ORDER BY 
    count(*) DESC ;