谏知中文网

悟已往之不谏,知来者之可追

关于MySQL索引优化

发表于 2016-06-27 2317 次浏览

索引常用于下面操作:

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操作变慢,因为在保存数据的同时也要更新索引文件。占用磁盘空间,特别数据量大的时候新建组合索引会让索引文件急剧变大。要想提高程序查询效率,除了使用索引,合理设计数据库表结构、优化查询语句也是必不可少的步骤。