匹配最左前缀:B-tree找到姓为tang的人
匹配列前缀: 匹配某列的值的开头部分 查找姓氏以T开头的人
匹配范围值:索引查找姓大于Tang小于zhu的人
精确匹配一部分并且匹配某个范围的另外一部分:
查找姓为Tang并且名字以字母K开头的人 精确匹配last_name列并且对
first_name进行范围查询
只访问索引的查询:B-tree支持只访问索引的查询,不会访问行
B-tree局限性:(案例中索引顺序:last_name first_name dob )
如果查找没有送索引列的最左边开始,没有什么用处,即不能查找所有叫Kang 的人,也不能找到所有出生在某天的人,因为这些列不再索引最左边,也不能使用该索引超找某个姓氏以特定字符结尾的人。
不能跳过索引的列,即不能找到所有姓氏为Tang并且出生在某个特定日期的人,如果不定义first_name列的值,Mysql只能使用索引的第一列。
存储引擎不能优化任何在第一个范围条件右边的列,比如查询是where last_name = 'Tang'AND first_name like 'K%' AND dob='1993-09-23' 访问只能使用索引头两列。
由此可知 索引列顺序的重要性!
目前只有Memory存储引擎支持显示的哈希索引,而且Memory引擎对我来说不常用,所以我们就轻描淡写的过了吧。
Myisam支持空间索引,可以使用geometry空间数据类型。
空间索引不会要求where子句使用索引最左前缀可以全方位索引数据,可以高效使用任何数据组合查找 配合使用mercontains()函数使用。
fulltext是Myisam表特殊索引,从文本中找关键字不是直接和索引中的值进行比较。
全文索引可以和B-Tree索引混用,索引价值互不影响。
全文索引用于match against操作 而不是普通的where子句。
通常索引几个字符,而不是全部值,以节约空间并得到好的性能,同时也降低选择性。
索引选择性是不重复的索引值和全部行数的比值。高选择性的索引有好处,查找匹配过滤更多的行,唯一索引选择率为1最佳状态。
blob列、text列及很长的varchar列,必须定义前缀索引,mysql不允许索引他们的全文。
造数据
#复制一份与cs_area表结构
#插入1600数据
#模拟真实数据
#表area有name列 需要对name列前缀索引
#计算得比值接近0.9350就好了
#分别取 3 4 5位name值计算
#可知name列添加5位前缀索引就可以了
#Mysql不能在order by 或 group by查询使用前缀索引 也不能将其用作覆盖索引
聚集索引不是一种单独的索引类型,而是一种存储数据的方式。
Innodb 的聚集索引实际上同样的结构保存了B-tree索引和数据行,"聚集" 是指实际的数据行和相关的键值保存在一起,每个表只能有一个聚集索引,因此不能一次把行保存在两个地方。 (由于聚集索引对我来说不常用,我们就略过啦~)
索引支持高效查找行,mysql也能使用索引来接收列的数据。这样不用读取行数据,当发起一个被索引覆盖的查询,explain解释器的extra列看到 using index。
#满足条件:#
# select 查询的字段必须 有索引全覆盖
select last_name,first_name 其中 last_name 和first_name 必须都有索引
#不能在索引执行like操作
mysql排序结果的方式:使用文件排序 、 扫描有序的索引
explain中的type列若为 "索引(Index)" 说明mysql扫描索引。单纯扫描索引很快,如果mysql没有使用索引覆盖查询 就不得不查找索引中发现的每一行。
mysql能有为排序和查找行使用同样的索引,如表 user 索引 (uid,birthday ) 。
使用排序索引:
重复索引:类型相同,以同样的顺序在同样的列创建索引,比如在表user id列 添加 unique(id)约束 、id not null。
primary key 约束 index(id),其实这些是相同的索引 !
多余索引:如存在(A)索引 应该扩展它 满足 (A,B)索引
(A,B)索引 (B)
(A,B)索引 (A)
(A,B) A最左前缀 (B,A) B最左前缀
设计user表 字段:country、 state/region 、city 、sex 、age 、eye 、color 功能:支持组合条件搜索用户 支持用户排序 用户上次在线时间
不在选择性很差的列添加索引
索引和表维护
表维护三个目标:查找和修复损坏、维护精确的索引统计,并减少碎片
check table 命令:确定表是否损坏,能抓到大部分表和索引错误
repair table 命令:修复损坏的表
myisamchk :离线修复工具
analyze table cs_area 更新索引统计信息,便于优化器优化sql
show index 命令检查索引的基数性
myisam引擎 使用 optimize table 清除碎片 Innodb 引擎 使用 alter table .. engine = .. 重新创建索引
正则化和非正则化
实例:统计过去24小时发布的信息精确的数量
周期创建可以得到没有碎片和全排序索引的高效表
注意:此法会将数据清除,只是得到一个没有碎片和高效的索引表。
计数表:比如缓存用户朋友数量、文件下载次数 通常建立一个单独的表,以保持快速维护计数器。
计划任务定期聚合函数查询,更新对应的字段。