Поскольку никто еще не упомянул об этом, вот начало решения, использующего 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. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.
Первичный ключ всегда индексируется. Это то же самое для MyISAM и InnoDB и, как правило, справедливо для всех механизмов хранения, которые поддерживают индексы.
Первичный ключ всегда автоматически индексируется и уникален. Поэтому будьте осторожны, чтобы не создавать избыточные индексы.
Например, если вы создали таблицу как таковую
CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;
, потому что вы хотите индексировать первичный ключ и принудительно установить ограничение уникальности на это, на самом деле, вы создадите три индекса на foo
!
Несмотря на то, что в 2009 году было задано вопрос, я бы опубликовал фактическую ссылку на документацию MySQL на первичные ключи. http://dev.mysql.com/doc/refman/5.5/ru/optimizing-primary-keys.html
Первичный ключ для таблицы представляет собой столбец или набор столбцов, которые вы используете в своих наиболее важных запросах. Он имеет связанный индекс для быстрой производительности запросов
blockquote>. Справочник по MySQL 5.0 см.: http://dev.mysql.com/doc/refman/5.0/en/mysql- indexes.html
Большинство индексов MySQL (PRIMARY KEY, UNIQUE, INDEX и FULLTEXT) хранятся в B-деревьях. Исключение состоит в том, что индексы на пространственных типах данных используют R-деревья и что таблицы MEMORY также поддерживают хеш-индексы.
blockquote>
Я думаю, это ответ
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)
Индексы лучше всего использовать для столбцов, которые часто используются в предложениях и в любой сортировке, например «order by». Возможно, вы работаете над более сложной базой данных, поэтому хорошо помнить несколько простых правил.
Вам не нужно явно создавать индекс для первичного ключа ... это делается по умолчанию.
Первичный ключ неявно индексируется как для MyISAM, так и для InnoDB. Вы можете проверить это, используя EXPLAIN в запросе, который использует первичный ключ.
Согласно http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html , похоже, что это будет неявным