Является ли составной первичный ключ таким же, как составной? [Дубликат]

Поскольку никто еще не упомянул об этом, вот начало решения, использующего Nashorn (часть выполнения JavaScript для Java 8).

Решение

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

Сравнение производительности

Я написал контент JSON, содержащий три массива соответственно 20, 20 и 100 элементов. Я хочу получить только 100 элементов из третьего массива. Я использую следующую функцию JavaScript для синтаксического анализа и получения моих записей.

var fun = function(raw) {JSON.parse(raw).entries};

Выполнение вызова в миллион раз с использованием Nashorn занимает 7.5 ~ 7.8 секунд

(JSObject) invocable.invokeFunction("fun", json);

org.json принимает 20 ~ 21 секунд

new JSONObject(JSON).getJSONArray("entries");

Джексон занимает 6,5 ~ 7 секунд

mapper.readValue(JSON, Entries.class).getEntries();

В этом случае Джексон работает лучше, чем Nashorn, который работает намного лучше, чем org.json. Nashorn API сложнее использовать, чем org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.

209
задан ElliotSchmelliot 2 March 2014 в 23:40
поделиться

8 ответов

Первичный ключ всегда индексируется. Это то же самое для MyISAM и InnoDB и, как правило, справедливо для всех механизмов хранения, которые поддерживают индексы.

246
ответ дан Emil H 26 August 2018 в 06:23
поделиться

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

Например, если вы создали таблицу как таковую

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

, потому что вы хотите индексировать первичный ключ и принудительно установить ограничение уникальности на это, на самом деле, вы создадите три индекса на foo!

1
ответ дан dr01 26 August 2018 в 06:23
поделиться

Несмотря на то, что в 2009 году было задано вопрос, я бы опубликовал фактическую ссылку на документацию MySQL на первичные ключи. http://dev.mysql.com/doc/refman/5.5/ru/optimizing-primary-keys.html

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

. Справочник по MySQL 5.0 см.: http://dev.mysql.com/doc/refman/5.0/en/mysql- indexes.html

Большинство индексов MySQL (PRIMARY KEY, UNIQUE, INDEX и FULLTEXT) хранятся в B-деревьях. Исключение состоит в том, что индексы на пространственных типах данных используют R-деревья и что таблицы MEMORY также поддерживают хеш-индексы.

12
ответ дан fyrye 26 August 2018 в 06:23
поделиться

Я думаю, это ответ

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
6
ответ дан Leistungsabfall 26 August 2018 в 06:23
поделиться

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

  • Индексы замедляют вставки и обновления, поэтому вы хотите тщательно их использовать в столбцах, которые ЧАСТОТНО обновлены .
  • Индексы ускоряются там, где предложения и порядок. Не забудьте подумать о том, КАК ваши данные будут использоваться при создании ваших таблиц. Есть еще несколько вещей, которые нужно запомнить. Если ваша таблица очень маленькая, т. Е. Всего несколько сотрудников, хуже использовать индекс, чем оставить его, и просто позволить ему выполнять сканирование таблицы.
  • Индексы действительно пригодны только для таблиц, которые есть много строк.
  • Еще одна вещь, которую следует помнить, то есть con в ситуации базы данных нашего сотрудника, состоит в том, что если столбец является переменной длиной, индексы (как и большинство MySQL) выполняют гораздо менее эффективно.
  • Не забудьте также присоединиться! Индексированные поля объединений ускоряют работу.
3
ответ дан Masood Ul Hassan 26 August 2018 в 06:23
поделиться

Вам не нужно явно создавать индекс для первичного ключа ... это делается по умолчанию.

8
ответ дан Oliver A. 26 August 2018 в 06:23
поделиться

Первичный ключ неявно индексируется как для MyISAM, так и для InnoDB. Вы можете проверить это, используя EXPLAIN в запросе, который использует первичный ключ.

10
ответ дан Patrick Gryciuk 26 August 2018 в 06:23
поделиться

Согласно http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html , похоже, что это будет неявным

29
ответ дан PSU_Kardi 26 August 2018 в 06:23
поделиться
Другие вопросы по тегам:

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