| @@ -18,14 +18,27 @@ | ||
| 18 | 18 | `meta_value` LONGTEXT NULL DEFAULT NULL, |
| 19 | 19 | `created_at` DATETIME NULL, |
| 20 | 20 | `updated_at` DATETIME NULL, |
| 21 | 21 | |
| 22 | - INDEX `{$indexPrefix}_meta_key` (`meta_key` ASC),"; | |
| 22 | + INDEX `{$indexPrefix}_meta_key` (`meta_key` ASC), | |
| 23 | + INDEX `{$indexPrefix}_object_meta` (`object_id` ASC, `meta_key` ASC),"; | |
| 23 | 24 | } |
| 24 | 25 | |
| 25 | 26 | public static function migrated() |
| 26 | 27 | { |
| 27 | 28 | static::dropCompositeUniqueIndex(); |
| 29 | + static::addObjectMetaIndex(); | |
| 30 | + } | |
| 31 | + | |
| 32 | + public static function addObjectMetaIndex() | |
| 33 | + { | |
| 34 | + // "ALTER TABLE %i ADD INDEX `{prefix}fct_pm__object_meta` (`object_id`, `meta_key`)" | |
| 35 | + // Every read of this table looks a row up by owner: `object_id = ? AND meta_key = ?` | |
| 36 | + // (variant thumbnails, product licence meta). The only index was on `meta_key`, | |
| 37 | + // which is not selective — one key dominates the table — so those lookups scanned | |
| 38 | + // it. Composite and non-unique on purpose: the unique variant was dropped above | |
| 39 | + // because a single object legitimately holds repeated keys. | |
| 40 | + static::addIndexIfNotExists(static::getDbPrefix() . 'fct_pm__object_meta', ['object_id', 'meta_key']); | |
| 28 | 41 | } |
| 29 | 42 | |
| 30 | 43 | public static function dropCompositeUniqueIndex() |
| 31 | 44 | { |