SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.10.2008 06:07:43

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Индексы и хранение кавычек

Здраствуйте.
Запутался я в очередной раз.
Все данные передаваемые запросу через mysql_escape_strint попадают в запрос и в бд соответственно. И вот заметил что " не экранируется. Магические кавычки на сервере лично вырубал, но вопрос безопасно ли это? уже такая кучемала в голове по вопросам что можно, а что нельзя делать в БД и разрешать юзерам делать...


Также вопрос по индексам. Вот есть у меня форум. Там всё мило, номер топика, номер поста, автор, всякие там атрибуты... всё в своих индексах в соответствии с запросами, НО поле текста самого с типом text и оно не попадает под "класические" индексы. Сделав индекс ему fulltext в запросах это не ощущается. Если сделать explain запроса то он не выдает Using Index. Как это решить не подскажите?

Заранее спасибо.

Неактивен

 

#2 25.10.2008 13:22:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексы и хранение кавычек

Магические кавычки правильно, что вырубили, см. статью http://webew.ru/articles/198.webew

Что значит " не экранируется? Если бы не экранировалась, то Вы бы получили синтаксическую ошибку при выполнении запроса. В базе конечно должно знаниться в обычном виде.

Никак не сделать в общем виде индекса на text-поле. А какие конкретно запросы и что именно хотите добиться?

Неактивен

 

#3 25.10.2008 15:59:09

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

То есть я в пхпmyadmin вижу что в поле например:

---
текст текст цитата: "ля ля ля"
---

а разве правильно должно быть не

---
текст текст цитата: \"ля ля ля\"
---

?! Просто нас несколько людей на проекте, и один сделал вставку данных в бд с "слешированием" кавычек, а у меня везде без, вот и запутался. Что правильно и что безопасно, а что нет соответственно.





Ну пример опять же: "SELECT * FROM `forum`.`post` WHERE `tid`= 1"

Выбираем все сообщения для топика с ID 1.

Структура таблицы:

fid int(8)
tid int(8)
pid int(8)
aid int(8)
text text
date datetime
editdate datetime
st enum

Опять же насколько мне говорили на форуме softtime если сделать EXPLAIN запроса, то должно писать в extra типа "Using where; using index; using filesort", а у меня:

id = 1
select_type = SIMPLE
table = post
type = ALL
possible_keys = null
key = null
key_len = null
ref = null
rows = 435
Extra = using where


Может мне чепуху сказали на софттайме? Просто там четко сформулировали что при explain должны выводиться параметры индексов (ключ, его размер и т.п.) и соответственно в extra должно встречаться Using Index
Мол иначе без использования индексов запрос довольно медленно будет исполняться и т.п. Нам сейчас к сожалению не проверить реальной нагрузкой устойчивость этого отсутсвия индекса, но всё же хотелось бы знать истину. Потому что есть ряд запросов, которые работали по 3-6 сек, после оптимизации с помощью создания индексов добились, чтобы в первый раз работал за 0.5 - 0.6, а потом из кеша ещё быстрее (сложный запрос на 5 таблиц и кучу подсчетов).

Отредактированно Proger (25.10.2008 16:02:29)

Неактивен

 

#4 25.10.2008 21:52:06

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Индексы и хранение кавычек

Правильно и безопасно делать "слеширование" с помощью специальных функций: например, в php это mysql_escape_string(), т.к. нужно экранировать не только двойные кавычки, но и одинарные:

echo mysql_escape_string($s); // выведет \'\"

и вообще так в целом удобнее.

Правильно Вам про индекс сказали. Хотя ваш EXPLAIN выглядит странно. Если у Вас есть ключ (индекс) на поле tid, то он должен использоваться, т.к. в WHERE простое условие.
Правда, если таблица маленькая, оптимизатор может считать, что быстрее последовательно перебрать всю таблицу, чем лазить по индексу.

Неактивен

 

#5 26.10.2008 09:30:15

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

Индексы такие:
pid (номер сообщения автоинкремент) PRIMARY
Потом индекс gid, в нём все поля кроме текст
и поле text с fulltext.

А как ключ на tid сделать, если он же должен быть уникальным для каждого поста. А tid номер топика. То есть в одном же топике не одно же сообщение. Сразу поясню что fid это номер форума где топик и пост, а aid это ид автора поста. st - системный статус сообщения. date, editdate дата создания/редактирования сообщения.

Я тут вообще где-то вычитал, что индекс fulltext нужен в большинстве для полнотекстового поиска, который я не использую...



Насчет "слеширования" видимо в отдельном скрипте, где " как-то не так через mysql_escape_string проходят, я посмотрю. Главное что теперь знаю как должно быть и уверен в этом. Не будет путаницы в дальнейшем. Спасибо.

Правда маленькая неясность:

Что значит " не экранируется? Если бы не экранировалась, то Вы бы получили синтаксическую ошибку при выполнении запроса. В базе конечно должно знаниться в обычном виде.

Что всё-таки в конечном результате через phpmyadmin или mysql query browser я должен видеть в полях? " или \" ???

Отредактированно Proger (26.10.2008 09:32:09)

Неактивен

 

#6 28.10.2008 03:18:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексы и хранение кавычек

Через phpmyadmin должны видеть все в оригинальном виде, без лишних слешей.
Ключ на tid сделать: ALTER TABLE имя_таблицы ADD KEY(tid);
При это он не обязательно уникальный. Еще рекомендую прочитать про составные ключи.

Неактивен

 

#7 29.10.2008 08:01:19

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

хм... ну и получил в итоге при EXPLAIN: extra: Using where; Using filesort,  key: tid

Вроде как он обратился к этому индексу, но как-то странно...

ЗЫ кстати я думал что такой одинарный индекс ничем не поможет. Спасибо, буду знать такой "приём" smile

Неактивен

 

#8 29.10.2008 15:06:22

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Индексы и хранение кавычек

хм... ну и получил в итоге при EXPLAIN: extra: Using where; Using filesort,  key: tid

Что, прям вот на прямой обычный SELECT показывает filesort? wink наверняка у Вас там в WHERE или ORDER BY какая-нибудь составная операция есть.

Неактивен

 

#9 29.10.2008 15:18:28

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

я сделал как в рабочем скрипте... вывод конкретного топика... WHERE `tid` = 24

Неактивен

 

#10 29.10.2008 21:02:17

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Индексы и хранение кавычек

Вы можете весь запрос привести? (интересно, откуда filesort)

Неактивен

 

#11 30.10.2008 09:52:37

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

Да конечно... если нужно могу дать дамп.

Запрос про который я говорил это

SELECT * FROM `forum`.`post` WHERE `tid` = 24
был...

А вообще нужна оптимизация реального запроса от скрипта типа:

SELECT * FROM `forum`.`post` WHERE `tid` = 13 ORDER BY `pid` ASC LIMIT 0, 25

Неактивен

 

#12 30.10.2008 10:19:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексы и хранение кавычек

В таком случае нужен составной ключ:

ALTER TABLE post ADD KEY(tid,pid)

Неактивен

 

#13 31.10.2008 15:29:17

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Индексы и хранение кавычек

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson