Индексы в Mysql

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-04 12:17:43

ok, понятно подумал может тонкости есть еще какие-то
zg писал(а):
ProFTP писал(а):KEY `word` (`word`,`page`)
мде... смысла в этом мало. Но это просто составной индекс.
т.е. это все равно что так написать?

Код: Выделить всё

KEY (`word`, `page`)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение Gamerman » 2009-12-06 22:33:13

Ну, не совсе все равно. Потому как на этот КЕЙ что-то должно ссылаться по имени.
Глюк глюком вышибают!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-17 10:10:57

а можно ли написать так

PRIMARY KEY (id_pa, id_pf, id_un)

вместо KEY unik (id_pa, id_pf, id_un) ?

я видел некоторые так пишут, а некоторые нет
Последний раз редактировалось ProFTP 2009-12-18 1:32:31, всего редактировалось 4 раза.
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-17 10:33:24

откректировал пост, вообщем не знаю как правильней

там где поиск, и выборка по ним, там надо поставить INDEX ?

ограничения уникальности я потавил в PRIMARY KEY чтобы там несколько связать

===

в примерах нигде не написано, каким фигом оно должно - не знаю,

может там наверное надо было, так написать KEY unik (id_pa, id_pf, id_un) вместо PRIMARY KEY ???
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-18 1:05:08

ну вот например один запрос, как к нему индесы праивльно стоят?
там ошибок нету?

Код: Выделить всё

SELECT t1.id_co,  
                                 t1.id_va,            
                                       t1.id_un,             
                                           t1.name_va,          
                                              t1.description_va,  
                                              t1.hidden_va,          
                                              t1.created,    
                                              t1.privat_va,        
                                                         
                                              t2.name_co,
                                    t2.active_co,
                                              t2.hiden_co,         
                                              t2.hiden_g_co,
                                              t2.close_co,
                                              t3.hiden_g_co AS hiden_g_se,    
                                              t3.active_se,                                
                                              t4.username,

                                              (SELECT count(*) 
                                                 FROM video_files AS t5 
                                                WHERE t1.id_va = t5.id_va
                                                      ) AS count_video_files,

                                              (SELECT SUM(t6.size_vf) 
                                                 FROM video_files AS t6 
                                                WHERE t1.id_va = t6.id_va
                                                      ) AS sum_v_video_files,
                                                      
                                              (SELECT min(t7.id_vf) 
                                                 FROM video_files AS t7,
                                                       video_files_preview AS t8                                                   
                                                WHERE t1.id_va = t7.id_va
                                                     AND t7.size_vf is NOT NULL 
                                                 AND t7.size_vf > 0  
                                                 AND t7.id_vf = t8.id_vf                                                          
                                                      ) AS video_files ,
                                                      
                                              (
                                            SELECT MIN(t10.id_vfp)                 
                                                    FROM video_files_preview AS t10
                                               WHERE t10.id_vf = video_files
                                                   AND t10.id_vf = video_files
                                                LIMIT 1                                              
                                              )    AS min_v_video_files                                                    
                                                                                      
                                                                                                      
                            FROM video_albums AS t1        

                       LEFT JOIN users AS t4
                              ON t1.id_un = t4.id           
                            
                              AND t1.active_co = 1
                     AND t1.hiden_co = 0
                     AND t1.hiden_g_co = 0'
                               
                           ORDER BY t1.created desc   
                           LIMIT ?,?

Код: Выделить всё

| video_files | CREATE TABLE `video_files` (
  `id_vf` mediumint(9) NOT NULL auto_increment,
  `id_va` mediumint(9) NOT NULL,
  `id_un` mediumint(9) NOT NULL,
  `name_vf` varchar(50) default NULL,
  `description_vf` varchar(600) default NULL,
  `created` int(11) NOT NULL,
  `hidden_vf` tinyint(1) NOT NULL default '0',
  `viewing` int(11) NOT NULL default '0',
  `size_vf` mediumint(9) default NULL,
  `duration` varchar(15) default NULL,
  `convert_vf` tinyint(1) default '0',
  PRIMARY KEY  (`id_vf`)

+PRIMARY KEY (`id_vf`, id_va, id_un )
INDEX viewing (viewing)
INDEX size_pf (size_pf)
INDEX created (created) - для сортировки

Код: Выделить всё

| video_albums | CREATE TABLE `video_albums` (
  `id_va` mediumint(9) NOT NULL auto_increment,
  `id_co` mediumint(9) default NULL,
  `id_un` mediumint(9) NOT NULL,
  `name_va` varchar(50) NOT NULL,
  `description_va` varchar(600) default NULL,
  `created` int(11) NOT NULL,
  `hidden_va` tinyint(1) NOT NULL default '0',
  `privat_va` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id_va`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 | 

+ PRIMARY KEY ( id_pa, id_un )
INDEX viewing (viewing)
INDEX size_pf (size_pf)
INDEX created (created) - для сортировки
INDEX hidden_pa (hidden_pa)
INDEX privat_pa (privat_pa)

Код: Выделить всё

| video_files_preview | CREATE TABLE `video_files_preview` (
  `id_vfp` mediumint(9) NOT NULL auto_increment,
  `id_vf` mediumint(9) NOT NULL,
  `id_va` mediumint(9) NOT NULL,
  `id_un` mediumint(9) NOT NULL,
  PRIMARY KEY  (`id_vfp`)
) ENGINE=MyISAM AUTO_INCREMENT=197 DEFAULT CHARSET=utf8 | 
+PRIMARY KEY (`id_vfp`, id_vf, id_va, id_un )

Код: Выделить всё

| content | CREATE TABLE `content` (
  `id_co` int(11) NOT NULL auto_increment,
  `id_un` int(11) NOT NULL,
  `id_se` int(11) NOT NULL,
  `name_co` varchar(255) NOT NULL,
  `heading_name_co` varchar(800) NOT NULL,
  `keys_co` varchar(800) NOT NULL,
  `text_co` text NOT NULL,
  `active_co` tinyint(1) NOT NULL default '1',
  `hiden_co` tinyint(1) NOT NULL default '1',
  `hiden_g_co` tinyint(1) NOT NULL default '0',
  `close_co` tinyint(1) NOT NULL default '1',
  `voting_co` tinyint(1) NOT NULL default '1',
  `vo_all_co` int(11) NOT NULL default '1',
  `vo_balls_co` int(11) NOT NULL default '1',
  `vo_per` varchar(20) NOT NULL default '0',
  `created` int(11) NOT NULL,
  `modified` int(11) NOT NULL default '1',
  `forbi_comm_co` tinyint(1) NOT NULL default '0',
  `viewing` int(11) default NULL,
  `ip` varchar(20) NOT NULL,
  `host` varchar(255) default NULL,
  `forwarded` varchar(20) default NULL,
  PRIMARY KEY  (`id_co`)
) ENGINE=MyISAM AUTO_INCREMENT=76 DEFAULT CHARSET=utf8 COMMENT='X0 - content category' | 
+PRIMARY KEY (`id_co`, id_se, id_un )
INDEX created (created) - для сортировки
INDEX active_co (active_co)
INDEX hiden_co (hiden_co)
INDEX hiden_g_co_co (hiden_g_co)
INDEX close_co (close_co)

поиск по этом полям нужно будет делать:
UNIQUE host (host) - может быть NULL
UNIQUE forwarded (forwarded) - может быть NULL
UNIQUE ip (ip) - может быть NULL
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Индексы в Mysql

Непрочитанное сообщение zg » 2009-12-19 21:20:37

ProFTP писал(а):                                              (SELECT count(*)                                                  FROM video_files AS t5                                                 WHERE t1.id_va = t5.id_va                                                      ) AS count_video_files,
гм... тут никакие индексы не спасут, запрос будет всё равно тупить. Самое правильное решение - хранить количество файлов по категориям в отдельной специальной таблице. А обновлять инфу через триггеры.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-20 3:26:27

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

я размышлял: триггеры говрят глючат сильно, при добавлении или удалении идут внутрение лишниые запросы, и если таблиц много таких лишних может быть 5-15...
например, в phpBB2 на сколько я знаю триггеры не используються, даже счетчики на главной странице, вот при больших нагрузках, говорили, что спасает кэширование, где один запрос из 300 будет тормозить, а все остальные 299 номрально :) может поробовать так сделать :)

===

а остальное как? (может я что-то грубо перупатал?)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Индексы в Mysql

Непрочитанное сообщение zg » 2009-12-20 8:08:05

ProFTP писал(а):я размышлял: триггеры говрят глючат сильно
а ты пробовал? :smile: или тока в теории мыслил?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-20 8:57:01

это hizel говорил и где-то написано было...

но там просто реально может быть 5-20 запросов UPDATE лишних (зачем их делать?)... ну это просто как вариант... посмотреть на кэширования

там где много count'ов будет, то там скорее всего нужен именно триггер...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Индексы в Mysql

Непрочитанное сообщение zg » 2009-12-21 20:55:49

ProFTP писал(а):это hizel говорил
а тебе голова на кой? :smile:
ProFTP писал(а):и где-то написано было...
на заборах тоже написано :smile:
ProFTP писал(а):но там просто реально может быть 5-20 запросов UPDATE лишних (зачем их делать?)
откуда такие цифры? :shock:
ProFTP писал(а):там где много count'ов будет, то там скорее всего нужен именно триггер...
я вроде про таблицу говорил, не?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Индексы в Mysql

Непрочитанное сообщение ProFTP » 2009-12-22 5:38:09

ну я написал что поставлю тогда когда будут глючить:
ProFTP писал(а):да, я видел, но я на первый раз так сделал, потом поставлю триггер...
это же не проблема, вообще...? и это зависит от того какая таблица, правильно? если она будет маленькая?
(вот вариант использования кэширвоание, без триггеров http://www.opennet.ru/tips/info/1780.shtml )
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Индексы в Mysql

Непрочитанное сообщение zg » 2009-12-22 18:40:13

ProFTP писал(а):это же не проблема, вообще...?
ну... пока не попробуешь не узнаешь :smile: