应该就是创建索引了,一般是时间排序吧
我理解的是,就是建立索引的列的数据,你不能在一个列对应的是text列上面建立一个索引,而是选择简单的数据类型比如int,长度比较短的varchar,这样一次IO读取的索引会更多,越容易命中对应的值
就是在创建表时或前期要指定相关的列或者多个列为索引,即建立好索引了。到后期查询数据时,使用上条件where或者order by之类的,条件查询要中包含索引列,那么MYSQL在执行查询时就自动使用索引来扫描查询了。
举个例子,比如,要先在表test中建立索引 :mysql>create index idx_id on test(id);
之后查询数据时这样写 :mysql>select * from test where id>5; 这样MYSQL查询时就自动使用索引来查询了;
相反,如果你写 :mysql>select * from test; 这样的语句MYSQL就不能通过扫描索引查询而是扫描全表查询。
越小效率越高
如果两个大表join那应该是不如单表有索引的使用in的,join的笛卡尔积使得需要查询的数据量是两个表的乘积,量太大
就是拿来建立索引的那个字段,其字段越小越好,因为字段小,索引节点就小,每个页存放的索引节点就多,然后在遍历时,IO数就更少
I/O (Input/Output) 输入输出的意思。在这里一般指文件IO,也就是文件的读取和写入。
简单解释,组合索引index(a,b) 会创建基于a,ab创建两个索引。你想一下创建索引的原则是什么?如果某列的离散度很低,一个表有100w行数据,该列只有两种不同的值,你会在该列上创建索引吗? 所以就明白了,如果a的离散度很低,在a上创建索引和前面分析的原则是不是矛盾了。总结,就是要降低扫描索引的消耗,为什么离散度高了可以降低,这是btree的结构问题
这个可不一定啊,如果只有一个字段的索引,比如:key(city_code),使用的查询就是select city_code from tab where ...的话,这个就可以说是覆盖索引了,但是并不是联合索引啊
CREATE INDEX index_name ON table(column(length))