【建表原则】
定长与边长相分离
常用与不常用相分离
适当反范式
【列类型选择】
int > date,time > enum,char > varchar > blob,text
字符串相对于整形要考虑字符集和校对集
尽量不用NULL
【btree索引 hash索引】
有必要使用联合索引(多列索引、复合索引)(左前缀原则)要考虑列顺序
分析sql
explain 查询语句 \G;
【聚簇索引(innodb) 非聚簇索引(myisam)】
innodb 次级索引指向对主键的引用(因为主键索引下是数据)
页分裂:按主键重新排序组织数据
innodb 防止页分裂 避免主键不规则插入
索引覆盖:查询的数据不回行直接在索引树上就能找到
注意:innodb的叶子不要太过沉重,否则查询会较慢
性能跟踪工具
set profiling=1(打开)
show profiles
show profile cpu,block,io for query 查询语句的id
set profiling=0(关闭)
【理想的索引】
1、常用
2、区分度高
3、长度较小
4、尽量覆盖常用索引
较长字段建索引办法:
只取前几位(直到区分度相当较高)创建索引(create index 索引名 on 表名 列名(长度))
或者(alter table 表名 add index 索引名 on 列名(长度))
重复较多字段建索引办法:
1、倒叙 2、伪哈希算法(新增一个字段,存这个字段的hash,然后在这个字段上建立索引)
多列索引:
ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))
避免查询产生filesort
禁止重复索引 可以冗余索引
整理索引碎片(optimize table 表名)表优化
【explain】
show status like "_tables%";(查看有没有发生在磁盘上的排序)
强制使用索引:(不推荐)
最后也是最重要的一点:结合实际优化索引