Creating Compound Indexes on Many Flags
Bottom line:  Can't be optimized.

But, you can speed things up some by minimizing the size of the rows.  Such will be especially beneficial if the table is too big to be cached.

Here's one approach.

Put the flags in a single MEDIUMINT UNSIGNED column.  That will give you up to 24 yes/no values in a mere 3 bytes.  DATE is 3 bytes.  Your id is perhaps 4 bytes.  Put those three things into an index -- total of 10 bytes (plus a lot of overhead).

I suggest this ordering:  INDEX(date, flags, id).  Then have code like:

SELECT id FROM tbl
    WHERE date &gt;= ... AND date &lt; ...
      AND (flags &amp; $mask) = $value;


The steps will be


Range scan using the first column of the index (date) to limit the number of index 'rows' to search.
Perform the boolean operation to filter out rows based on the flags
Get the id so you can go off to the table to get whatever other info you need.


Something like:

SELECT b.*
    FROM (
        SELECT ... -- as above
         ) AS filter
    JOIN tbl AS b  USING(id)
    ORDER BY ...


The ORDER BY on the end won't be able to use any index, but it will benefit from having all the filtering already done, so only the desired number of rows will be involved.