By default mysqldump locks every table it is reading, which on a busy database means writes queue behind the backup for as long as it runs. --single-transaction instead opens one repeatable-read transaction and dumps from that snapshot, so the dump is consistent and nothing is blocked.
mysqldump --single-transaction --quick --routines
-u backup -p shop | gzip > /var/backups/shop-$(date +%F).sql.gz
The condition attached to it is that this only works for transactional tables. A MyISAM table has no snapshot to read from, so it is dumped as it happens to be at the moment the dump reaches it — and a database with a mix of engines produces a file that is consistent for half of itself and silently not for the other half. Any DDL running concurrently breaks the snapshot as well, which is why the nightly cron and the deploy that alters a table should never overlap.