MySQL эффективный запрос (выберите и обновите) - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть таблица, структура которой выглядит следующим образом:

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ttype` int(1) DEFAULT '19',
`title` mediumtext,
`tcode` char(2) DEFAULT NULL,
`tdate` int(11) DEFAULT NULL,
`visit` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `tcode` (`tcode`),
KEY `ttype` (`ttype`),
KEY `tdate` (`tdate`)


ENGINE=MyISAM 

У меня есть два запроса к x.php, такие же как:

SELECT * FROM table_name WHERE id='10' LIMIT 1
UPDATE  table_name SET visit=visit+1 WHERE id='10' LIMIT 1

Моя первая проблема заключается в том, чтовызывает ли обновление 'посещение' в таблице переиндексацию и снижение производительности или нет?Обратите внимание на то, что «посещение» не является ключевым.

Вторым методом может быть создание новой таблицы, содержащей «посещение», как показано ниже:

'newid' int(10)  unsigned NOT NULL ,
`visit` int(11) DEFAULT '0',
 PRIMARY KEY (`newid`),

     ENGINE=MyISAM 

Таким образом, выбирая

SELECT w.*,q.visit FROM table_name w  LEFT JOIN table_name2 q 
ON (w.id=q.newid) WHERE w.id='10' LIMIT 1 

    UPDATE  table_name2 SET visit=visit+1 WHERE newid='10' LIMIT 1

Является ли второй метод предпочтительным по сравнению с первым методом?Какой из них будет иметь лучшую производительность и будет быстрым?

Примечание: все запросы sql будут выполняться PHP (команда mysql_query).Также мне нужны первые индексы таблиц для других запросов на других страницах.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Был вопрос, который кто-то задал ранее , на который я ответил решением, которое вы также можете рассмотреть.Когда вы делаете «подсчет» столбцов, вы теряете возможность добывать данные позже.С таблицей транзакций вы можете не только получать счетчики «просмотров», но и запрашивать диапазоны дат и т. Д. Конечно, вы будете нести вес хранения потенциально сотен тысяч строк, но таблица узкая и числовые индексы.

1 голос
/ 05 ноября 2011

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

Я бы предпочел первое, и использовал это для подобных вещей в прошлом без проблем. Вы можете удалить предложение limit, так как id - ваш первичный ключ, у вас никогда не будет более 1 результата, хотя оптимизатор запросов, вероятно, сделает это за вас.

0 голосов
/ 05 ноября 2011

Я не вижу решения на стороне базы данных ... Возможно, вы можете сделать это на PHP: если у пользователя есть сеанс PHP, вы можете, например, обновлять счетчик посетителей каждый 10-й раз, например:

<?php
session_start();
$_SESSION['count']+=1;
if ($_SESSION['count'] > 10) {
  do_the_function_that_updates_the_count_plus_10();
  $_SESSION['count'] = 0;

}

Конечно, вы теряете некоторые счета, таким образом, но, возможно, это не так важно?

...