强制索引能调utf8吗 mysql强制索引有什么坏处_强制索引能调utf8吗


索引

索引是帮助MySQL高效获取数据的排好序的数据结构

索引的好处

1.提高数据检索速度,降低数据库IO成本。就是通过缩小表中需要查询的记录的数目从而加快搜索速度。

2.降低数据排序的成本,降低CPU消耗。之所以查的快,是因为先将数据排好序了。

索引坏处

1.占用存储空间:索引实际上是一张表,记录了主键和索引字段,一般以索引文件的形式存储在磁盘上。

2.降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更。

索引的类型

索引都是实现在存储引擎层的,主要有6中类型

1.普通索引:最基本的索引,没有任何约束

ALTER TABLE 'table_name' ADD INDEX

2.唯一索引:与普通索引类似,但具有唯一性约束

ALTER TABLE 'table_name' ADD UNIQUE('column')

3.主键索引:特殊的唯一索引,不允许有空值

ALTER TABLE 'table_name' ADD PRIMARY KEY('column')

4.复合索引:将多个组合在一起创建索引,可以覆盖多个列

ALTER TABLE 'table_name' ADD INDEX('colimn1','column2')

5.外键索引:只有InnoDB类型的表才可以使用外建索引,保证数据的一致性,完整性和实现级联操作

6.全文索引:MySQL自带的全文索引只能用于InnoDB,MyISAM,并且只能对英文进行全文检索,一般使用全文索引引擎

ALTER TABLE 'table_name' ADD FULLTEXT('column')

索引的删除:

DROP INDEX 索引名 ON 表名

ALTER TABLE 表名 DROP INDEX 索引名

在MySQL中索引主要分为hash和B+树

hash:查找速度快,只能精确查找,不能够范围查找

B+树特点:性能

B+树和B树结构图

B树特点:1.叶子节点具有相同深度

2.所有索引元素不重复

3.结点中的数据从左往右递增


强制索引能调utf8吗 mysql强制索引有什么坏处_mysql级联查询_02


B+树特点1.非叶子结点不存储data,只存储索引,这样就可以放更多索引

2.叶子节点包含了所有的索引字段

3.叶子节点用双向指针连接,这样可以提高区间访问


强制索引能调utf8吗 mysql强制索引有什么坏处_强制索引能调utf8吗_03


索引存储机制

InnoDB(聚集索引):叶子节点中保存了完整的数据记录称为聚集索引


强制索引能调utf8吗 mysql强制索引有什么坏处_mysql级联查询_04


MylSAM(非聚集索引):叶子节点只存储数据地址,还需要回表


强制索引能调utf8吗 mysql强制索引有什么坏处_mysql索引_05


主键索引的叶子节点存的数据是整行数据,在InnoDB中,主键索引也被称为聚集索引。

非主键索引的叶子节点存的数据是整行数据的主键,键值是索引。在InnoDB里,非主键索引也被称为辅助索引。

辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,需要进过两步:

首先,InnoDB 存储引擎会遍历辅助索引找到主键。

然后,再通过主键在聚集索引中找到完整的行记录数据。

MySQL为什么一定要有一个主键:没有主键,就无法使用B+树,就不能存储数据

InnoDB规则:

1.如果一个主键被定义了,那么这个主键就是作为聚集索引

2.如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

3.如果没有唯一的,会生成唯一的rowid,该列的值会随着数据的插入自增

联合索引


强制索引能调utf8吗 mysql强制索引有什么坏处_mysql级联查询_06


假如创建联合索引(a,b,c),相当于建了三个索引,(a),(a,b),(a,b,c),这也是最左匹配原则

索引使用注意事项

1.尽量避免在子句中使用!=或<>操作符,否则引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行

2.尽量避免在where子句中使用or来连接条件,否则将放弃索引导致全局扫描

3.尽量避免在where子句中对字段进行表达式操作,将放弃索引导致全局扫描

4.尽量避免在where子句中对字段进行函数操作,将导致全局扫描

5.列类型是字符串类型,查询时一定要给值加引号,否则索引失效

6.LIKE查询,%不能在前,因为无法使用索引,可以在后,最左前缀

使用explain命令可以查看慢SQL

具体explain分析字段可以查看脑图

https://github.com/zy-yz/mybatis-test/blob/master/MYSQL/%E7%B4%A2%E5%BC%95/explain.xmind](https://github.com/zy-yz/mybatis-test/blob/master/MYSQL/索引/explain.xmind)