2013-12-16 4 views
0

У меня здесь небольшая ошибка, кажется, что мои страницы загружаются медленнее и медленнее, большинство контента добавляется в базу данных.Выполнение запросов выполняется быстрее

Я уже добавил индексы в поля ID и ID_ *, которые исправили проблему некоторое время назад, но больше не работают.

Я также запускаю OPTIMIZE на всех таблицах.

вот мой запрос:

select 
l.id, l.id_infusionsoft, l.name_first, l.name_last, l.postcode, a.website as a_website, l.website as l_website, l.date_added, 
a.id_dealership, a.id_lead, a.id as id_assign, a.date_assigned, a.manual_or_auto, a.assigned_by, 
d.name as dealership, 
COALESCE(a.date_assigned, l.date_added) AS date_sort 
from `leads` as l 
left join `assignments` as a on (a.id_lead = l.id) 
left join `dealerships` as d on (d.id = a.id_dealership) 
order by date_sort desc 

здесь табличные структуры:

CREATE TABLE assignments (
    id int(11) NOT NULL auto_increment, 
    id_dealership int(11) NOT NULL, 
    id_lead int(11) NOT NULL, 
    date_assigned int(11) NOT NULL, 
    website varchar(255) NOT NULL default '', 
    make varchar(255) NOT NULL default '', 
    model varchar(255) NOT NULL default '', 
    ip_address varchar(255) NOT NULL default '', 
    is_reassign varchar(255) NOT NULL default 'no', 
    manual_or_auto varchar(255) NOT NULL default 'N/A', 
    assigned_by varchar(255) NOT NULL default 'N/A', 
    PRIMARY KEY (id), 
    KEY id_dealership (id_dealership), 
    KEY id_lead (id_lead), 
    KEY date_assigned (date_assigned) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=24569 ; 

CREATE TABLE dealerships (
    id int(11) NOT NULL auto_increment, 
    province varchar(255) NOT NULL default '', 
    city varchar(255) NOT NULL default '', 
    `name` varchar(255) NOT NULL, 
    email text NOT NULL, 
    email_subject varchar(255) NOT NULL default 'Car Lead', 
    `type` varchar(255) NOT NULL, 
    make varchar(255) NOT NULL, 
    leads int(11) NOT NULL default '0', 
    `status` varchar(255) NOT NULL, 
    low_notif int(11) NOT NULL, 
    reassign_id int(11) NOT NULL, 
    reassign_days int(11) NOT NULL, 
    salesman varchar(255) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=176 ; 

CREATE TABLE leads (
    id int(11) NOT NULL auto_increment, 
    id_infusionsoft int(11) NOT NULL, 
    name_first varchar(255) NOT NULL, 
    name_last varchar(255) NOT NULL, 
    email varchar(255) NOT NULL, 
    phone_home varchar(255) NOT NULL, 
    phone_cell varchar(255) NOT NULL, 
    phone_work varchar(255) NOT NULL, 
    postcode varchar(255) NOT NULL, 
    website varchar(255) NOT NULL, 
    address varchar(255) NOT NULL, 
    province varchar(255) NOT NULL, 
    employer varchar(255) NOT NULL, 
    city varchar(255) NOT NULL, 
    rentorown varchar(255) NOT NULL, 
    emp_months varchar(255) NOT NULL, 
    emp_years varchar(255) NOT NULL, 
    sin varchar(255) NOT NULL, 
    occupation varchar(255) NOT NULL, 
    monthly_income varchar(255) NOT NULL, 
    bankruptcy varchar(255) NOT NULL, 
    tradein varchar(255) NOT NULL, 
    cosign varchar(255) NOT NULL, 
    monthly_payment varchar(255) NOT NULL, 
    residence_years varchar(255) NOT NULL, 
    residence_months varchar(255) NOT NULL, 
    birthday varchar(255) NOT NULL, 
    make varchar(255) NOT NULL, 
    model varchar(255) NOT NULL, 
    date_added int(11) NOT NULL, 
    ip_address varchar(255) NOT NULL default '', 
    time_to_call varchar(255) NOT NULL, 
    referrer varchar(255) NOT NULL default '', 
    `source` varchar(255) NOT NULL, 
    PRIMARY KEY (id), 
    KEY id_infusionsoft (id_infusionsoft), 
    KEY date_added (date_added) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20905 ; 

что я могу сделать, чтобы мой пробег запрос быстрее?

EDIT: вот объясните выберите вывод:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE l ALL  NULL NULL NULL NULL 15381 Using temporary; Using filesort 
1 SIMPLE a ref  id_lead  id_lead  4 infu.l.id 1  
1 SIMPLE d eq_ref PRIMARY  PRIMARY  4 infu.a.id_dealership 1  
+0

Можете ли вы опубликовать план выполнения? –

+1

Из любопытства, есть ли причина, почему одна из ваших таблиц - MyISAM, а остальные - InnoDB? Кроме того, рассмотрите возможность публикации вывода «EXPLAIN SELECT ...» – Amber

+0

Любое воздействие, если вы удалите «order by date_sort desc»? –

ответ

2
  • Используйте InnoDB вместо MyISAM. InnoDB кэширует как данные, так и индексы, тогда как MyISAM кэширует только индексы. InnoDB has other benefits too.

  • Нужно ли вам все 15381 подходит для этого запроса? Или вы пытаетесь запросить только подмножество потенциальных клиентов, например, те, которые имеют задания и представительства?

  • Удостоверьтесь, что вы understand the type of join you're using. Я подозреваю, что вы используете левое соединение, когда вам нужно внутреннее соединение. Вероятно, это приводит к тому, что набор результатов будет больше, чем нужно. Добавление накладных расходов для сортировки, использования памяти и т. Д.

  • Выберите типы данных более подходящим образом. Каждая строка должна быть varchar (255)? Вы знаете, что varchars pad out to their maximum length in memory? Вы даже используете varchar (255) для хранения IP-адреса. Кроме того, вы используете целое число со знаком для хранения дат?

  • Изменить следующий индекс:

    ALTER TABLE assignments ADD KEY assgn_lead_dealership (id_lead, id_dealership), 
        DROP KEY id_lead; 
    
+0

хорошо, что запрос передается через функцию разбиения на страницы, которая добавляет к нему «limit X, X». поэтому он не запрашивает все строки, всего 10 из них, и все еще очень медленный. ive изменилось на innodb, когда я делаю внутреннее соединение, это дает мне нежелательные результаты, будет ли изменение varchars действительно ускорить его? как я уже сказал, все еще очень медленный. – scarhand

+1

«limit Y, X» должен сканировать строки Y + X, а не только строки X. –

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