2013-12-19 2 views
2

Определения таблицы и индекс, как нижеЗапрос работает дольше. Оптимизация внушения

CREATE TABLE `asin` (
    `ASIN` tinytext, 
    `URL` tinytext, 
    KEY `ind1` (`ASIN`(20)) 
) ENGINE=MyISAM DEFAULT 

CREATE TABLE `info` (
    `ASIN` tinytext, 
    `Title` tinytext, 
    `Description` tinytext, 
    KEY `ind1` (`ASIN`(20)), 
    KEY `ASIN` (`ASIN`(20)) 
) ENGINE=MyISAM DEFAULT 

В настоящее время первая таблица содержит 15056 записей и вторая таблица содержит 19975 записей.

Я хочу узнать записи, присутствующие в ASin таблицы и не существует в информационном столе

SELECT A.ASIN FROM ASIN A 
WHERE NOT EXISTS (SELECT 1 FROM INFO B WHERE A.ASIN = B.ASIN) 

Запрос занял 145.2200 сек

Я думал, что это эффективный способ запрос будет работать, но запрос принимая больше времени. Любое предложение. Надеюсь, я расскажу все подробности.

+0

Эта статья поможет http://explainextended.com/2009/09/18/not-in- vs-not-exist-vs-left-join-is-null-mysql/ – Meherzad

ответ

0

Используйте обратное левое соединение!

SELECT a.asin 
FROM asin AS a 
LEFT JOIN info AS b ON a.ASIN=b.ASIN 
WHERE b.ASIN IS NULL 
+0

Я уже пробовал эту опцию, но не улучшил ее принятие больше, чем текущее время. Его принятие 228.010 Sec – user3117500

+0

Да, после перехода на Varchar это работает быстрее. Но в Tinytext он не выполняется быстро. – user3117500

+0

Tinytext не может использовать индекс объединения - VARCHAR. Это имеет огромное значение. –

1

«Я уже пробовал этот вариант, но никакого улучшения его не принимать больше, чем текущее время.»

Я думаю, что вы используете индекс префикс 20 байт на ASIN

дизайн рассмотрения

  1. TINYTEXT является evalent к VARCHAR(255). Нет причин для 20-байтового префикса INDEX, если вы не касаетесь дискового пространства.

    CREATE TABLE `asin` (
        `ASIN` VARCHAR(255), 
        `URL` VARCHAR(255), 
        KEY `ind1` (`ASIN`) 
    ) ENGINE=MyISAM DEFAULT; 
    
    CREATE TABLE `info` (
        `ASIN` VARCHAR(255), 
        `Title` VARCHAR(255), 
        `Description` VARCHAR(255), 
        KEY `ind1` (`ASIN`) 
    ) ENGINE=MyISAM DEFAULT; 
    
  2. отношения между asin и info. один к одному? один-ко-многим ?, Если один-к-одному. объединить две таблицы в одну таблицу.

    CREATE TABLE `asin` (
        `ASIN` VARCHAR(255), 
        `URL` VARCHAR(255), 
        `Title` VARCHAR(255), 
        `Description` tinytext, 
        KEY `ind1` (`ASIN`) 
    ) ENGINE=MyISAM DEFAULT; 
    
  3. вам нужно PRIMARY KEY

    • не производительность, связанные с MyISAM. Но наличие ПК - хорошая практика.
  4. использовать InnoDB вместо MyISAM

    • Вы можете использовать FK.
    • Роу замок уровень
    • Transaction
    • кластерный индекс (применимо только PK)
+0

Нет причин для 20-байтового префикса INDEX, если вы касаетесь дискового пространства. Нет причин для 20-байтового префикса INDEX, если вы касаетесь дискового пространства. И что касается вашего предложения VARCHAR, это было потрясающе. После объявления таблицы и загрузки одних и тех же данных запрос выполнялся в Fraction of Second. Спасибо большое – user3117500

+0

@ user3117500 Мое удовольствие ;-) Наконец, почему бы вам не выполнить запрос Eugen 'LEFT JOIN/IS NULL'. Я предполагаю, что это немного быстрее, чем «НЕ СУЩЕСТВУЕТ». Интересно, проверяете ли вы свои и Юджина и даете мне знать результаты? Спасибо. –

+0

Да, перейдя на Varchar, это лучше. Я проверил его запрос с объявлением TINYTEXT. – user3117500

Смежные вопросы