В целом, индексы помогают ускорить поиск базы данных, имея недостаток использования дополнительного дискового пространства и замедления запросов INSERT
/ UPDATE
/ DELETE
. Используйте EXPLAIN
и прочитайте результаты, чтобы узнать, когда MySQL использует ваши индексы.
Если таблица имеет шесть столбцов, и все они доступны для поиска, я должен индексировать их все или ни один из них ?
blockquote>Индексирование всех шести столбцов не всегда является лучшей практикой.
(a) Собираетесь ли вы использовать любой из этих столбцов при поиске конкретной информации?
(b) Какова избирательность этих столбцов (сколько различных значений хранится по сравнению с общим количеством записей в таблице)?
MySQL использует калькулятор, основанный на оптимизации, который пытается найти «самый дешевый» путь при выполнении запроса. И поля с низкой селективностью не являются хорошими кандидатами.
Каковы негативные последствия индексации производительности?
blockquote>Уже ответил: дополнительное дисковое пространство, более низкая производительность во время insert - update - delete.
Если у меня есть столбец VARCHAR 2500, доступный для поиска с частей моего сайта, я должен его индексировать?
blockquote>Попробовать индекс FULLTEXT .
Возможно, вы хотите ifelse
:
a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).
Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»
Best
if
оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse
. В вашем случае достаточно написать
w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
или короткую векторную версию
ifelse(a > 0, a/sum(a), 1)
. Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длина 1 (в остальной части) и ifelse
дает выходной вектор длины, равный длине a
.
Как я решал этот вопрос, когда я пытался сделать что-то подобное, когда я определял функцию, и он вызывался с массивом, как другие указывали
. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.
sapply(a, function(x) afunc(x))
afunc<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
Вот простой способ без ifelse
:
(a/sum(a))^(a>0)
Пример:
a <- c(0, 1, 0, 0, 1, 1, 0, 1)
(a/sum(a))^(a>0)
[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25