性能优化(索引篇)
数据库性能查询语句(了解即可)
> show status like 'value' ; // 查询数据库的性能,value可以是如下值
Connections:连接mysql服务器的次数
uptime:服务器上线时间
Slow_queries:慢查询次数
Com_select:查询操作的次数
Com_insert:插入操作的次数
Com_delete:删除操作的次数
sql分析语句:explain和describe
> explain select * from tb_name;
其展现的结果中
possible_keys列:指定了为了提高查找速度,在mysql中可以使用的索引
key列:指定实际使用的键
普通查询算法包括
顺序查找算法:逐个查找,效率很低。
二分法查找算法:从中间开始查,不断的把数据分成两部分,直到找到目标数据。数据需排序。
二叉树查找算法:从根节点开始,向子节点叶查找。
哈希查找算法:将数据通过哈希函数创建成哈希表,将查询的值也通过哈希函数生成相应的值,再到哈希表里去查。(个人推测很可能数据变成哈希值后,检索速率很提升很高吧)。
sql在执行查询时,如果查询条件指定了索引字段,那么将会按照这个索引字段的值,去查数据库相应表维护的索引数据,由此索引数据,再去查出目标数据。
初学者不要忘了索引的意义,索引数据与目标数据是关联的,就像是新华字典一样,索引数据是目录,目标数据则是内容(目录也是数据,也要占存储空间,这也说明了有些索引字段建多了,空间反倒会占的多)
MySQL采用B+Tree数据结构作为存储索引的结构,B+Tree是二叉树的一种衍生。
B+Tree中每个树叉叫做节点,最末端的树梢叫做叶子节点。节点上存的都是索引值,叶子节点则会根据InnoDB与MyISAM存储引擎的不同而存储不同的数据类型。
在MyISAM存储引擎下,索引分为主索引和辅助索引
主索引指主键或唯一标识生成的索引,主索引的叶子节点下存的是目标数据的地址
辅索引指其他列(字段)构建的索引,辅索引的叶子节点下存的也是目标数据地址
在InnoDb存储引擎下,索引分为主索引和二级索引(也有叫聚集索引和非聚集索引的)
聚集索引指主键或唯一标识生成的索引,其的叶子节点下直接存储目标数据
非聚集索引指其他列构建的索引,其叶子节点下存的是主索引的索引值,再以这个主索引值去找出目标数据。(也就是说在 这个非聚集索引数据区获得对应的主索引值,再拿着这个主索引值去主索引数据区获得对应的目标数据)
通过这种索引值来找目标数据,明显要比普通的顺序逐个查找速度快的多。
但要注意,sql语句中有几种情况是应用不到这种索引查询的,尽管有索引字段的参与,他们使用的仍是普通的顺序查询算法。我们可以用 explain来查看sql语句中到底有没有应用到索引。
- like模糊查询时,字符串首字符为百分号[%]时,索引不会被使用,如果不是第一位置,索引会被正常使用。
- 使用or关键字时,只有两侧字段都是索引字段才会应用索引查询。
初学者要注意,应用explain是可以查看sql是否有应用索引查询的,无需死记硬背那种情况不能应用索引。