MySQL索引

计算机软件开发 2024-9-28 06:00:53 52 0 来自 中国
索引
[list]
[*]索引并不是越多越好,要根据查询有针对性的创建,思量在WHERE和ORDER BY下令上涉及的列创建索引,可根据EXPLAIN来查察是否用了索引还是全表扫描
[*]应只管制止在WHERE子句中对字段举行NULL值判断,否则将导致引擎放弃使用索引而举行全表扫描
[*]值分布很稀疏的字段不恰当建索引,比方"性别"这种只有两三个值的字段
[*]字符字段只建前缀索引
[*]字符字段最好不要做主键
[*]不消外键,由步调包管束缚
[*]只管不消UNIQUE,由步调包管束缚
[*]使用多列索引时主意序次和查询条件保持同等,同时删除不须要的单列索引
[/list]简言之就是使用合适的数据范例,选择合适的索引
[size=6]选择合适的数据范例[/size]

(1)使用可存下数据的最小的数据范例,整型 < date,time < char,varchar < blob
(2)使用简单的数据范例,整型比字符处理惩罚开销更小,由于字符串的比力更复杂。如,int范例存储时间范例,bigint范例转ip函数
(3)使用公道的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽大概使用not null界说字段
(5)只管少用text,非用不可最好分表
[size=6]选择合适的索引列[/size]

(1)查询频仍的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,由于数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(差别的值多)的列,放在团结索引前面。查察离散度,通过统计差别的列值来实现,count越大,离散水平越高:
关于前缀索引
偶然候须要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部门字符,如允许以大大节省索引空间,从而进步索引服从。但如许也会低沉索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/#T到1之间。索引的选择性越高则查询服从越高,由于选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
一样平常环境下某个前缀的选择性也是充足高的,足以满意查询性能。对于BLOB(BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的“容器”。),TEXT,大概很长的VARCHAR范例的列,必须使用前缀索引,由于MySQL不答应索引这些列的完备长度。
一个查询中针对差别前缀长度的选择性举行盘算,这对于大表非常有效,下面给出如安在同一个查询中盘算差别前缀长度的选择性:
mysql> select count(distinct left(city,3))/count([i]) as sel3,
-> count(distinct left(city,4))/count([/i]) as sel4,
-> count(distinct left(city,5))/count([i]) as sel5,
-> count(distinct left(city,6))/count([/i]) as sel6
-> from city_demo;
可以瞥见当索引前缀为6时的基数是0.4267,已经靠近完备列选择性0.4283。
在上面的示例中,已经找到了合适的前缀长度,下面创建前缀索引:
mysql> alter table city_demo add key (city(6));
前缀索引是一种能使索引更小,更快的有效办法,但另一方面也有其缺点:
mysql无法使用其前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描。
覆盖索引
通常大家会根据查询的WHERE条件来创建合适的索引,不外这只是索引优化的一个方面。筹划良好的索引应该思量到整个查询,而不但单是WHERE条件部门。索引确实是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,如许就不须要读取数据行。如果索引的叶子节点中已经包罗要查询的数据,那么另有什么须要回表查询呢?如果一个索引包罗(大概说覆盖)全部须要查询的字段的值,我们就称之为“覆盖索引”。
不是全部范例的索引都可以称为覆盖索引。覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,以是MySQL只能使用B-Tree索引做覆盖索引。别的,差别的存储引擎实现覆盖索引的方式也差别,而且不是全部的引擎都支持覆盖索引。
[size=4]使用总结[/size]

[size=5]开辟中须要留意的点[/size]

MySQL带索引的字段范例修改了,如:从int改为varchar。PHP的sql查询语句也要做相应修改,
$sql = 'select * from tb where trade_id='.(string)$trade_id;这里如果不做欺压范例转换,sql查询时将倒霉用索引。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 14:17, Processed in 0.166141 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表