Implement an appropriate index.
And when possible, don't wrap columns in expressions in predicates, when an equivalent predicate on the bare column is available. For example, this:
NOW() < DATE_ADD(`date`, INTERVAL 1 DAY);
can be replaced by this:
`date` > NOW() + INTERVAL -1 DAY
With the latter form, the right side gets evaluated once, and becomes a literal, and MySQL can consider an index range scan operation on the date
column to satisfy the predicate.
With the prior form, that's forcing MySQL to evaluate the expression on the right side and compare the result to the literal for every single row (or, at least, every row that isn't filtered out by some other predicate.)
The most appropriate index for this query would be to have the columns with the equality predicates leading, followed by the column with the inequality:
... ON page_view (ip_address, param, `date`)