performance_schema knows which indexes are never read

Guessing which of forty indexes on a table are dead is how they stay for years; the server has been counting reads per index the whole time.

SELECT object_schema, object_name, index_name,
       count_star, count_read, count_write
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE object_schema = 'shop'
  AND index_name IS NOT NULL
  AND count_star = 0
ORDER BY object_name;

Counters reset on server restart, so a table showing zero reads after two days of uptime proves nothing — the query is only meaningful after a full business cycle including the monthly reports. Cross-checking against sys.schema_unused_indexes, which wraps the same data, is worth doing because it excludes primary keys and unique constraints automatically. The result is a candidate list rather than a drop script.