本博客是用来记录本身学习的过程缓存
进行查询的时,索引列不能是表达式的一部分,也不能是函数的参数,不然没法使用索引服务器
例如user_id 为索引列,改索引不能生效函数
select user_id from user where user_id +1 =3;性能
在须要使用多个列做为条件进行查询时,使用多列索引比使用多个单列索引性能会更好.学习
select user_id ,phone from user where user_id = 1 and phone = 138xxxxxxx优化
让选择性强的索引列放在前面。索引选择性是指:不重复的索引值和记录总数的比值。最大值为1,此时每一个记录都有惟一的索引和它对应。选择性越高,查询效率也越高。操作系统
例如,从显示结果来看customer_id的值比company_id的值大,所以最好把customer_id 放在多列索引前面排序
SELECT COUNT(DISTINCT company_id)/COUNT() AS company_id_selectivity, COUNT(DISTINCT customer_id)/COUNT() AS customer_id_selectivity, COUNT(*) from customer a索引
对于列的值比较长,好比BLOB,TEXT,VARCHAR就必须创建前缀索引,就是把值的前一部分做为索引。这样既能够节约空间,又能够提升查询效率。但没法使用前缀索引作ORDER BY和 group BY,也没法使用前缀索引作覆盖扫描。内存
例如
alter table city add key(cityname(8))
跟联合索引有点相似,就是在查询Table的时候只用去读取索引而取得数据,无需进行二次查询相关表,这样的索引的叶子节点上面也包含了他们索引的数据。(就是索引包含全部须要查询的字段的值)
判断标准:使用explain,能够经过输出的extra列来判断,对应一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。
具备的优势:
1.索引一般远小于数据行的大小,只读索引能大大减小数据访问量。
2.一些存储引擎(例如MyISAM)在内存中只缓存索引。而数据依赖于操做系统来缓存。所以,只访问索引能够不适用系统调用。
3.对于InnoDB引擎,若辅助索引可以覆盖查询,则无需访问主索引。