Оптимизация простого запроса MariaDB и то, что на самом деле стоит в объяснении оператора формата json

У меня есть 2 вопроса:

  1. Можно ли как-нибудь оптимизировать или перефразировать этот запрос, чтобы я мог его выполнить? Я ждал более 2 дней, а запрос все еще выполнялся...

  2. Как «стоимость» (я читал, что это не единицы) переводится во что-то относительное, что я могу предсказать, насколько велик запрос или как долго он будет выполняться.

Вот план моего стола:

CREATE TABLE IF NOT EXISTS alb (
  id INT NOT NULL AUTO_INCREMENT,
  iid VARCHAR(169) UNIQUE NOT NULL,
  name TEXT,
  grp VARCHAR(255),
  prod VARCHAR(255),
  barcode VARCHAR(255),
  pr_ic DECIMAL(10,2),
  pr_al DECIMAL(10,2),
  pr_ap DECIMAL(10,2),
  pr_mp DECIMAL(10,2),
  q_ic INT,
  q_al INT,
  q_ap INT,
  q_mp INT,
  u_pr DECIMAL(10,2),
  ic VARCHAR(169),
  al VARCHAR(169),
  ap VARCHAR(169),
  mp VARCHAR(169),
  td VARCHAR(169),
  td_p INT,
  INDEX( iid, ic, al, ap, mp, td ),
  PRIMARY KEY( id )
);

CREATE TABLE IF NOT EXISTS al (
  id INT NOT NULL AUTO_INCREMENT,
  calc_pr DECIMAL(10,2),
  calc_pr_in_lc DECIMAL(10,2),
  def_barcode VARCHAR(255),
  def_barcode_quantity INT,
  name TEXT,
  grp VARCHAR(255),
  name1 TEXT,
  name2 TEXT,
  pr1 DECIMAL(10,2),
  pr1_in_lc DECIMAL(10,2),
  pr2 DECIMAL(10,2),
  pr2_in_lc DECIMAL(10,2),
  pr_in_lc DECIMAL(10,2),
  product_id VARCHAR(255),
  iid VARCHAR(255),
  iid2 VARCHAR(255),
  supplier_iid VARCHAR(255),
  tax INT,
  INDEX( iid, iid2 ),
  PRIMARY KEY( id )
);

и вот план выполнения:

SELECT a.iid, al.iid
  FROM alb a
 INNER JOIN al ON a.al LIKE concat( al.iid, '%' );
MariaDB [db]> EXPLAIN FORMAT=JSON SELECT a.iid, al.iid FROM alb a INNER JOIN al ON a.al LIKE concat( al.iid, '%')\G
*************************** 1. row ***************************
EXPLAIN: {
  "query_block": {
    "select_id": 1,
    "cost": 301476723.4,
    "nested_loop": [
      {
        "table": {
          "table_name": "a",
          "access_type": "index",
          "key": "iid_2",
          "key_length": "3059",
          "used_key_parts": ["iid", "ic", "al", "ap", "mp", "td"],
          "loops": 1,
          "rows": 1744202,
          "cost": 627.4988767,
          "filtered": 100,
          "using_index": true
        }
      },
      {
        "block-nl-join": {
          "table": {
            "table_name": "al",
            "access_type": "index",
            "key": "iid",
            "key_length": "1536",
            "used_key_parts": ["iid", "iid2"],
            "loops": 1744202,
            "rows": 1859159,
            "cost": 301476095.9,
            "filtered": 100,
            "using_index": true
          },
          "buffer_type": "flat",
          "buffer_size": "256Kb",
          "join_type": "BNL",
          "attached_condition": "a.al like concat(al.iid,'%')"
        }
      }
    ]
  }
}
1 row in set (0.003 sec)

Примеры значений:

+---------------+-----------------+
| alb.al        | al.iid          |
+---------------+-----------------+
| 0 001 107 438 | 0 001 107 438 3 |
| 0 001 107 444 | 0 001 107 444   |
| 0 001 107 446 | 0 001 107 446   |
| 0 001 107 476 | 0 001 107 476   |
| 0 001 108 021 | 0 001 108 021   |
| 0 001 108 230 | 0 001 108 230   |
| 0 001 108 237 | 0 001 108 237   |
| 0 001 108 239 | 0 001 108 239   |
| 0 001 108 241 | 0 001 108 241   |
| 0 001 108 405 | 0 001 108 405   |
+---------------+-----------------+

@O.Jones, спасибо за ваш комментарий, мне было интересно, почему я получил -1. обновлено.

Slawowid 18.04.2024 23:40

Сколько строк в каждой таблице? Каковы примеры значений используемых столбцов?

Rick James 19.04.2024 20:20

@RickJames, как вы можете видеть из объяснения: table alb = "rows": 1744202 и table al = "rows": 1859159. Примеры значений обновлены в основном потоке.

Slawowid 21.04.2024 15:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
alb:  INDEX(al,  iid)

Будет лучший «охватывающий» индекс для этого запроса, добавьте его. Это может значительно ускорить запрос.

Другие вопросы по теме