- 索引的类型
- 主键索引(唯一索引的特殊类型)
- 唯一索引
- 普通索引
- 联合索引
- 索引碎片修复
1、alter table t_name engine myisam; 2、optimize table t_name 修复表的数据及索引碎片,就会把所有的数据文件重新整理一遍,使之对齐. 这个过程,如果表的行数比较大,也是非常耗费资源的操作. 所以,不能频繁的修复.
3、选择合适的存储引擎:InnoDB分裂
对于InnoDB来说,因为节点下有数据文件,因些节点的分裂会比较慢,这也是插入速度不及MyISAM的原因
对于InnoDB来说,尽量用整型,而且是递增的整型,如果是无南规律的数据,将会产生分裂,影响速度
4、索引覆盖:
a)是指 如果查询的列恰好索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。这种查询速度非常快,称为索引覆盖
b)要回行到磁盘再找数据。
5、理想的索引
1、查询频繁、区分度高 、长度小、尽量能覆盖常用查询字段
1、索引长度:索引文件的大小会影响增删改查速度(占用内存多)
针对列中的值,从左往右截取部分,来建索引
1、截的越短,重复度越高,区分度越低,索引效果不好
2、截的越长,重复度越低,区分度越高,索引效果越好,但带来的影响也越大--增删改变慢,查也受影响(占内存)
惯用手法: 截取不同长度,并测试其区分度,
mysql> select count(distinct left(word,6))/count() from dict;
+---------------------------------------+
| count(distinct left(word,6))/count() |
+---------------------------------------+
| 0.9992 |
+---------------------------------------+
对于左前缀不易区分的列 ,建立索引的技巧
1: 把列内容倒过来存储,并建立索引,这样左前缀区分度大,
2: 伪hash索引效果,同时存 url_hash列
5、 多列索引的考虑因素---
列的查询频率 , 列的区分度,
以ecshop商城为例, goods表中的cat_id,brand_id,做多列索引
从区分度看,Brand_id区分度更高,
6、伪hash列:crc函数将字符串转换为整型
把要存的数据存为一列,加一列hash列作为索引