Actually this problem is actual for Magento 1 but I see it's still not fixed for Magento 2.
Refresh index is based on queue which is filled by triggers which adds entities to the queue even if entity values were not updated.
Lot of projects have custom modules like product import and other modules which do something with product attributes, for example, disable products without images so that SQL query match many rows but change only few of them so that triggers can generate queue faster than refresh index manage it.
It can be fixed easily by adding to the triggers "IF !(NEW.value <=> OLD.value)" condition.