2013-06-24 3 views
1

У меня есть таблица с плохими индексами, и я создаю php-страницу, где вы можете заполнить любое из полей, и оно даст вам результаты в зависимости от того, что было заполнено. это запрос, который я хочу запустить. Проблема заключается в том, что нет никаких индексов на просто fnameИспользовать столбец, но игнорировать данные в столбце

select * from members where 1 and fname = 'Ryan' limit 30 

Чтобы получить мой запрос, чтобы использовать индекс, мне нужно добавить lname к запросу. То, что я не знаю, заключается в том, как добавить его, не делая ничего (если это возможно).

select * from members where 1 and lname = '{ANYTHING}' and fname = 'Ryan' limit 30 

Я использовал {ANYTHING} в качестве заполнителя для обозначения, а любое значение. Выполнение этого будет использовать индекс, но как я могу сказать mysql игнорировать то, что находится в этом столбце для поиска (если возможно)?

+0

Вы хотите принять либо значение, либо значение? Значение возвращает все строки или фильтруется? Если это так, я бы коротко замыкался с переменной (например, (@MyLname IS NULL ИЛИ lname = @ MyLname), где @MyLName является параметром. –

+1

Как бы добавить фамилию, которую вы не знаете, а затем использовать подстановочный поиск, поможет улучшить поиск? (является ли индекс составным индексом имени Фамилия?), если да, почему бы не построить индекс JUST по имени? – xQbert

+0

'lname like%', но я сомневаюсь, что это вам поможет. – Kevin

ответ

2

Если ваш индекс на (lname,fname) и вы не знаете lname, то индекс по существу бесполезен для вида запроса вы делаете.

Это имеет смысл, если вы думаете об этом - индекс упорядочен сначала lname, затем fname. Без lname в индексе нет возможности найти данный fname, не сканируя всю вещь, что, конечно же, поражает цель использования индекса в первую очередь.

Это будет похоже на поиск всех Джонсов или Эриков в телефонной книге (которая «индексируется» по фамилии, а затем по имени). Без прочтения фамилии знание первого имени бесполезно или, по крайней мере, не лучше, чем сканирование всей телефонной книги.

Кроме того, ссылка на документы MySQL из here

MySQL не может использовать индекс, если столбцы не образуют крайний слева префикса индекса. Предположим, что вы указали инструкции SELECT :

SELECT * FROM tbl_name WHERE col1 = val1;

SELECT * FROM tbl_name WHERE col1 = val1 AND col2 = val2;

SELECT * FROM tbl_name WHERE col2 = val2;

SELECT * FROM tbl_name WHERE col2 = val2 И col3 = val3;

Если индекс существует (col1, col2, col3), то только первые два запроса используют индекс. Третий и четвертый запросы включают индексированные столбцы , но (col2) и (col2, col3) не являются левыми префиксами (col1, col2, col3).

+0

правда, но не должен ли он использовать часть индекса, по крайней мере, часть имени? –

+0

@Mark - Добавлен пример моей телефонной книги, чтобы проиллюстрировать, почему это не работает. Надеюсь, это поможет. –

+0

не должен быть индексом '(fname, lname)', поскольку те же самые имена чаще встречаются с теми же именами? –

0
SELECT * FROM members WHERE lname is not null AND fname = 'Ryan' 

http://sqlfiddle.com/#!2/2ef93/3

+0

Это не использует индекс –

+0

вправо, я не вынул 1 часть, см. ответ –

+0

все еще не работает –

0

Сразу думаю, что, вероятно, вы хотите этого. Если не мы переосмысливать :-)

select * from members where 1 and lname LIKE '%' and fname = 'Ryan' limit 30 
+0

like's не использует индексы, индексы должны иметь равенство –

+0

@Ryan Naddy, не верно, оператор LIKE сможет использовать индекс, если подстановочный знак находится в конце, т.е. LIKE 'Doe%' –

+0

@MarkBasmayor Ах, да вы правы, но с этим запросом он находится как в начале, так и в конце, поэтому он не использует индекс. –