Активный поиск записи - find_by_inventory_product_id периодически медленен, несмотря на добавление индекса - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть простая новая конечная точка API, которая включает запрос моей новой установочной и заполненной таблицы - inventory_products.

Схема таблицы inventory_products:

CREATE TABLE `inventory_products` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `inventory_product_id` binary(16) DEFAULT NULL,
  `product_id` binary(16) DEFAULT NULL,
  `status` enum('ACTIVE','INACTIVE','DELETED') DEFAULT 'ACTIVE',
  `priority` int(11) DEFAULT '0',
  `inventory_service_id` tinyint(3) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uc_inventory_product_id` (`inventory_product_id`),
  KEY `idx_product_status` (`product_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=76312817 DEFAULT CHARSET=utf8;

Конечная точка API в основном делаетниже:

def lookup_inventory_service_id
    return render_error_response(AUTH_ERROR, {status: 403}) unless client.name == PERMITTED_NAME

    ip_fetch_start = Time.now
    inventory_product = InventoryProducts.find_by_inventory_product_id(resource_attributes[:inventory_product_id])
    Rails.logger.info({inventory_product_id: resource_attributes[:inventory_product_id], inventory_product_fetch_time_ms: (Time.now - ip_fetch_start)*1000}.as_json)
    return head :not_found unless inventory_product
....

Проблема: поиск инвентаризации_продукта (find_by_inventory_product_id) - это стандартная функция, предоставляемая ActiveRecord Rails (я не перезаписывал ее в моей модели).Эта функция занимает от 10 мс, а иногда и 650 мс (об этом я узнал из добавленных мною журналов).Почему в некоторых случаях это занимает так много времени, а в других - меньше, несмотря на то, что для столбца, используемого в поиске, существует индекс Mysql?моя схема и MySQL-запрос, запущенный вышеупомянутой функцией, используют inventory_product_id в качестве индекса из приведенного ниже объяснения оператора.

объяснения SELECT inventory_products. * FROM inventory_products WHERE inventory_products. inventory_product_id = 0x3a288cdce78d44618eadd72e240f26a4 LIMIT 1

id select_type тип таблицы Возможные_ключи Ключ key_len Ref строки Дополнительная 1 ПРОСТОТА инвентаризация_произвести conc uc_inventory_product_id uc_inventory_product_24?Должен ли я явно упоминать в схеме запас_продукта как индекс mysql?Что-то вроде :

KEY `idx_product_status` (`product_id`,`status`)

Спасибо, заранее !!

Я использую Mysql 5.6 и рельсы - 3.2.8.Кроме того, мое приложение rails работает на сервере Tomcat (версия - Apache Tomcat / 7.0.16) внутри jruby (1.7.0) /

...