Дополнительная информация о last_query_cost в MySQL?

Я немного опаздываю, но если вам нравится свободный интерфейс, вы можете создать сеттеры для цепных вызовов следующим образом:

type myType struct {
  s string
  a, b int
}

func New(s string, err *error) *myType {
  if s == "" {
    *err = errors.New(
      "Mandatory argument `s` must not be empty!")
  }
  return &myType{s: s}
}

func (this *myType) setA (a int, err *error) *myType {
  if *err == nil {
    if a == 42 {
      *err = errors.New("42 is not the answer!")
    } else {
      this.a = a
    }
  }
  return this
}

func (this *myType) setB (b int, _ *error) *myType {
  this.b = b
  return this
}

И затем назвать это так:

func main() {
  var err error = nil
  instance :=
    New("hello", &err).
    setA(1, &err).
    setB(2, &err)

  if err != nil {
    fmt.Println("Failed: ", err)
  } else {
    fmt.Println(instance)
  }
}

Это похоже на идиому Функциональные опции , представленную в ответе @Ripounet, и обладает теми же преимуществами, но имеет некоторые недостатки:

  1. Если произойдет ошибка, она не будет немедленно прервана, поэтому , было бы немного менее эффективно, если бы вы ожидали, что ваш конструктор будет часто сообщать об ошибках.
  2. Вам придется потратить строку, объявляющую переменную err и обнуляющую ее.

Однако есть небольшое преимущество: вызовы функций такого типа должны быть проще для встроенного компилятора, но я действительно не специалист.

7
задан Toto 1 July 2009 в 22:57
поделиться

2 ответа

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

Как вы, несомненно, видели в руководстве :

Общая стоимость последней скомпилированной запрос, вычисленный по запросу оптимизатор. Это полезно для сравнение стоимости разных запросов планы по тому же запросу. По умолчанию значение 0 означает, что ни один запрос не еще не скомпилирован. Значение по умолчанию равно 0. Last_query_cost имеет сеанс размах.

Это действительно так. Это значение полезно только в качестве количественного измерения для сравнения различных запросов.

В Интернете есть несколько интересных ресурсов по оптимизатору запросов, если вы хотите узнать больше. К сожалению, у меня нет доступных вам ссылок, но найти ресурсы с помощью простого поиска по запросу «оптимизатор запросов mysql» не составит особого труда.

3
ответ дан 7 December 2019 в 12:24
поделиться

В этом сообщении звучит так, будто это просто оценка и, следовательно, не то, на что вы должны полагаться при расширенном профилировании:

Одна вещь, о которой я вам не показывал эти два запроса были ценностью Last_query_cost. Это потому что это показал более медленный и более требовательный к данным запрос действительно имеет более низкую стоимость чем более быстрый: Стоимость последнего запроса в Редизайне таблицы

 Имя_переменной Дизайн1 Дизайн2
Last_query_cost 20343.599000 71039.632551

Это довольно странно, правда? я не знаю, какова стоимость запроса расчетный; Я верю оптимизатору вычисляет это до фактического выполнение запроса. Это определенно не соответствует реальной стоимости выполнение этих запросов. Это обычно больше соответствует реальной стоимости, но не всегда. Вы не должны полагаться на это абсолютно.

2
ответ дан 7 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

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