MySQL的索引是什么
本篇文章为大家展示了MySQL的索引是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
和其它数据库一样,MySQL索引对表中指定列进行排序后另外保存,用于快速查找具有特定值的行。如果没有索引,必须从第一行开始,读取整个表查找,表越大,成本就越高。如果表中有相关列的索引,就可以快速确定要在数据文件中间查找的位置,而不必查看所有数据,比按顺序读取每一行快得多。
MySQL的PRIMARY KEY索引、UNIQUE索引、普通索引、FULLTEXT索引都使用B-trees存储,Spatial索引使用R-trees存储。
MySQL 5.7中的创建索引语法:
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,…)
[index_option]
[algorithm_option | lock_option] …key_part:
col_name [(length)] [ASC | DESC]index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT ‘string’index_type:
USING {BTREE | HASH}algorithm_option:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}lock_option:
LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
也可以使用alter table语句来创建索引。
MySQL支持前缀索引,即对索引字段的前N个字符创建索引。
访问原文提升阅读体验:https://www.modb.pro/db/22805?cyn
root@database-one21:56:[gftest]>select*fromemp;+--------+------+---------+------------+--------+|ename|age|sal|hiredate|deptno|+--------+------+---------+------------+--------+|郭军|27|8400.00|2019-12-08|10||刘杰|30|9100.00|2018-04-09|10||王艳|24|6000.00|2020-01-05|20||马丽|26|7200.00|2018-07-06|30||肖伟|29|8700.00|2017-05-28|30|+--------+------+---------+------------+--------+5rowsinset(0.02sec)root@database-one21:57:[gftest]>showindexfromemp\GEmptyset(0.01sec)root@database-one21:57:[gftest]>createindexidx_emp_enameonemp(ename(2));QueryOK,0rowsaffected(0.09sec)Records:0Duplicates:0Warnings:0root@database-one21:57:[gftest]>showindexfromemp\G***************************1.row***************************Table:empNon_unique:1Key_name:idx_emp_enameSeq_in_index:1Column_name:enameCollation:ACardinality:5Sub_part:2Packed:NULLNull:YESIndex_type:BTREEComment:Index_comment:1rowinset(0.00sec)root@database-one21:57:[gftest]>explainselect*fromempwhereenamelike'王%';+----+-------------+-------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+|1|SIMPLE|emp|NULL|range|idx_emp_ename|idx_emp_ename|9|NULL|1|100.00|Usingwhere|+----+-------------+-------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+1rowinset,1warning(0.07sec)root@database-one21:58:[gftest]>explainselect*fromempwheresal>6000;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|1|SIMPLE|emp|NULL|ALL|NULL|NULL|NULL|NULL|5|33.33|Usingwhere|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1rowinset,1warning(0.03sec)
可以看到,创建的索引是BTREE类型,并且在按照ename查询时被使用。
索引使用总有一些原则:
对经常在where、连接条件中出现的列考虑建索引。
对选择性比较好的列必要时建索引。比如用户表中,身份证的列具有不同值,选择性很好,索引被使用时特别高效;姓名列,选择性较好,索引被使用时也比较高效;性别列,只含有男和女,选择性很差,对此列建索引就没有多大用处。
不要过度创建索引。索引不是越多越好,每个索引都要占用磁盘空间,并会降低DML操作的性能。另外MySQL在生成执行计划时,过多的索引也会加重优化器的工作,甚至可能干扰优化器选择不到最好的索引。
上述内容就是MySQL的索引是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。