索引常用于下面操作:
1、快速查找匹配where子句的行
2、删除行
3、连表查询(大数据量表不提倡join操作)
4、对具有索引的列查找max或min值
常用索引分类:
1.普通B-Tree索引,也就是我们最常使用到的索引
2.唯一Unique索引,允许空值但不能重复
3.全文Fulltext索引,仅在MyISAM存储引擎下,支持char、varchar、text列,对于大容量的数据表,生成全文索引非常耗费时间和磁盘空间。
单列索引与多列索引:
mysql执行查询时只能使用一条索引,如果有col1和col2两个单列索引,会选择限制条件最严格的那条,而对于多列索引(col1, col2, col3)
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
可以直接取出行,根据最左前缀的要求,可以组合成(col1)、(col1, col2)、(col1, col2, col3)三种索引形式
注:mysql中like语句不能使用索引,所以数据量大的项目使用like模糊匹配会严重影响查询效率,对系统性能有很大影响。
like 'keywords%' 索引有效(常量字符串不以通配符开头)
like '%keywords%' 索引失效,全表扫描
考虑用locate语句替换:(或者instr、find_in_set等)
$t1 = microtime(TRUE); //$where['recommend'] = array('LIKE', '%2%'); $where[] = 'LOCATE(2, `recommend`) > 0'; $list = M('News')->where($where)->count(); $t2 = microtime(TRUE); echo '=='.($t2-$t1)*1000; 6w条数据,查询时间对比 ==3.000020980835 ==41.001796722412
不要在列上运算,会导致索引失效,进行全表查询
select * from table where YEAR(inputdate)<2016 改成select * from table where inputdate<'2016-01-01';
尽管使用索引能大大提高查询效率,同时它也会带来其他的问题,例如
让insert、update、delete操作变慢,因为在保存数据的同时也要更新索引文件。占用磁盘空间,特别数据量大的时候新建组合索引会让索引文件急剧变大。要想提高程序查询效率,除了使用索引,合理设计数据库表结构、优化查询语句也是必不可少的步骤。