@matt ... both of the above could be found via query logs and metrics.
3. Inadequate hardware: if your DB is 150GB and you have 1GB of RAM, you will always be trying to fight performance.
4. Locking: app is designed so that some requests block other requests.
5. Misconfiguration: DB, platform, or other parts of the stack are configured in a way that limits throughput.
...
@matt ... if this were Postgres, I could give you some queries to hunt for tables that need indexes, but it's not. Hopefully some MySQL folks will speak up with the same.