replication database vs mirroring database
Replication:

Its mainly for Reporting and database synchronization
Secondary database is online and searchable. Basically you can run queries against your secondary database and treat it like a normal database while protecting the performance of your primary database.

There are different forms of replication

Transactional - Reads transactions to your secondary DB(s) as they occur on your Primary with a slight delay

Snapshot - Takes dumps at scheduled times of the changes recorded in your logs since the last sync, and inserts them at a scheduled time

Merge - The term says a lot for itself. It will merge content between databases so you can update data in both DB's. You might use this if you have two identical databases from day 1, and you have App 1 talking to DB 1, and App 2 talking to DB 2 for load balancing purposes or something. At the end of the day you might want to merge the transactions that occurred during the day to make sure you have two full lists of transactions in each DB.

Mirroring :

Its mainly for disaster recover solution which now is deprecated and replaced with AlwaysOn AG. Secondary database is in an offline mode while mirroring is in place. This is to ensure integrity in the secondary database in the event of a failover being required. Nothing can write to the secondary database, so you know it will exactly match your primary.
Can replicate schema changes. What this means is if you add a new index, or a new table, it will automatically be mirrored over. This is not the case with replication, it will only transfer across data level changes.
There are many configurations you can put together for replication, or mirroring, and you'd have to identify exactly what setup would suit your needs, but the above is a good baseline as to the best practices. Note you could possibly have snapshots of the mirrored database for reading purposes but that comes with its caveat of additional disk space resources and management, data integrity, and more. Generally you would not use this for your reporting solution. 

Just gearing away from database mirrroring, if you are on SQL 2012 or later, can you consider AlwaysOn Availability Groups. It works just like database mirroring but allows the secondary replicas to be readable.