В C ++ (но не в обычном C) вполне правомерно печатать тип дважды, если оба определения полностью идентичны:
// foo.h
struct A{};
typedef A *PA;
// bar.h
struct A; // forward declare A
typedef A *PA;
void func(PA x);
// baz.cc
#include "bar.h"
#include "foo.h"
// We've now included the definition for PA twice, but it's ok since they're the same
...
A x;
func(&x);
Показывает, сколько строк было обработано для получения результата.
Причина неверных данных в том, что EXPLAIN неточна, она делает предположения о ваших данных на основе информации, хранящейся о вашей таблице.
Это очень полезная информация, например, когда вы выполняете JOINS для многих таблиц, и вы хотите чтобы убедиться, что вы не просматриваете всю объединенную таблицу для одной строки информации для каждой имеющейся у вас строки.
Вот тест на таблице из 608 строк.
SELECT COUNT(id) FROM table WHERE user_id = 1
Результат:
COUNT(id)
512
И вот объяснение
EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1
Результат:
id rows
1 608
Запрос EXPLAIN
будет использовать значение, указанное в таблице INFORMATION_SCHEMA
, которая содержит приблизительную оценку количества строк для таблиц innodb - см. Примечания раздел в документации mysql в INFORMATION_SCHEMA.TABLES .