💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# mysql索引 ## 索引类型 ### 普通索引 create index index_name on table_name(field_name); ### 唯一索引 unique index ### 主键 auto_increment primary key(id) ### 组合索引(为什么field2或者field2,field3字段上没有索引。这是由于BTree索引因要遵守最左前缀原则) create index index_name on table_name(field1,field2,field3); B+树是按照从左到右的顺序来建立搜索树的。如('张三',18,'18668247652')来检索数据的时候,B+树会优先匹配name来确定搜索方向,name匹配成功再依次匹配age、phoneNum,最后检索到最终的数据。 like 'aaa%'//会用到索引 id与name都建立单列索引 order by name desc 不会使用索引 (id,name)建立联合索引 最后需要注意mysql对排序记录的大小有限制:max_length_for_sort_data 默认为1024;也就意味着如果需要排序的数据量大于1024,则order by不会使用索引,而是使用using filesort 6、如何用好索引 (1)依据where查询条件建立索引; (2)使用联合索引,而不是多个单列索引; 例如:select * from tab_a where b=? and c=?这个SQL,对b c字段建立联合索引的效率比单列的索引效率更高。 (3)联合索引中索引的顺序根据区分度排,区分度大的放在前面。区分度是指字段值的种类,字段值种类越多的字段要放在前面,例如:idx_smp(name,gender)的效率要比idx_smp(gender,name)的效率高 (4)联合索引能为前缀单列、复列查询提供帮助; 例如: 有idx_smp(a,b,c)这样的索引,where a=?或者where a=? and b=?都可以使用该索引,但是where c=?就无法使用该索引。 (5)同样的,要合理创建联合索引,避免冗余 例如建立了idx_smp(a,b,c)就不需要建立idx_smp(a)、idx_smp(a,b)索引了。 (6)order by group by distinct等需要排序的操作,在没有索引的大数据量情况下需要排序,对IO和CPU性能消耗很大。如果有类似排序需求,则需要对相关字段建立索引,这样利用索引的有序特性不需要排序,直接按着索引顺序扫描即可。 (7)select …where .. like ‘%xx’;这种%放在头部的,是无法走索引的。 (8)select * 不建议使用,因为会读取大量数据,也不利于使用索引覆盖技术。索引字段能够完全在索引中获取, 就不要使用select *(因为会导致回表),无法完整在索引中获取,也是建议select具体字段。 mysql对于排序,使用了两个变量来控制sort_buffer_size和 max_length_for_sort_data show processlist