Предупреждающее сообщение: Условие имеет длину & ​​gt; 1 и будет использоваться только первый элемент [duplicate]

В целом, индексы помогают ускорить поиск базы данных, имея недостаток использования дополнительного дискового пространства и замедления запросов INSERT / UPDATE / DELETE. Используйте EXPLAIN и прочитайте результаты, чтобы узнать, когда MySQL использует ваши индексы.

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

blockquote>

Индексирование всех шести столбцов не всегда является лучшей практикой.

(a) Собираетесь ли вы использовать любой из этих столбцов при поиске конкретной информации?

(b) Какова избирательность этих столбцов (сколько различных значений хранится по сравнению с общим количеством записей в таблице)?

MySQL использует калькулятор, основанный на оптимизации, который пытается найти «самый дешевый» путь при выполнении запроса. И поля с низкой селективностью не являются хорошими кандидатами.

Каковы негативные последствия индексации производительности?

blockquote>

Уже ответил: дополнительное дисковое пространство, более низкая производительность во время insert - update - delete.

Если у меня есть столбец VARCHAR 2500, доступный для поиска с частей моего сайта, я должен его индексировать?

blockquote>

Попробовать индекс FULLTEXT .

25
задан Julius Vainora 5 January 2013 в 13:25
поделиться

5 ответов

Возможно, вы хотите 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
41
ответ дан user1317221_G 26 August 2018 в 01:38
поделиться

Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).

Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»

Best

9
ответ дан Atesh 26 August 2018 в 01:38
поделиться

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.

32
ответ дан jem77bfp 26 August 2018 в 01:38
поделиться

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

. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.

sapply(a, function(x) afunc(x))

afunc<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}
0
ответ дан rlhull6 26 August 2018 в 01:38
поделиться

Вот простой способ без 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
15
ответ дан Sven Hohenstein 26 August 2018 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: