MySQL索引分类及区别简述mysql三种索引区别

哎哟,说到MySQL索引,这可是个老生常谈的话题了。
咱们得好好聊聊,因为不同类型的索引啊,就像是不同的武器,用对了地方才能发挥出最大的威力。

首先呢,咱们得先来认识一下MySQL里的这些索引分类。
最常见的有三种:B-Tree索引、哈希索引和全文索引。
这三种索引各有各的特色,适用场景也不一样。

比如说,B-Tree索引,这可是个老江湖了,它就像是数据库里的老司机,能轻松应对各种查询。
比如说,你想找个特定的人,或者找个特定的时间段的数据,B-Tree索引都能帮你快速找到。
这玩意儿就像是路标一样,告诉数据库数据在哪里。
我记得我在2 01 2 年做项目的时候,就用B-Tree索引来优化查询,效果那是相当不错的。

再来说说哈希索引,这就像是数据库里的快枪手,专攻等值查询。
比如说,你想找个特定的ID,哈希索引就能帮你直接定位到那个数据。
但是,这玩意儿有个缺点,就是它不支持范围查询,就像是你用枪指着一个范围找目标,那可不行。

最后是全文索引,这就像是数据库里的搜索引擎,擅长处理文本搜索。
比如说,你想找个特定的文章或者评论,全文索引就能帮你快速找到。
不过,这玩意儿占用的空间比较大,而且插入数据的时候可能会慢一些。

咱们再来聊聊这些索引的区别。
比如说,B-Tree索引和哈希索引,B-Tree索引能做范围查询,哈希索引只能做等值查询。
再比如,B-Tree索引和全文索引,B-Tree索引适合处理高选择性数据,全文索引适合文本搜索。

总之,选择合适的索引类型,就像是选对了武器,能让你在数据库的战场上所向披靡。
当然,使用索引的时候也要注意维护,就像是要保养你的武器一样,这样才能保证它们始终处于最佳状态。

最后,咱们得提一下创建索引的语句。
创建B-Tree索引的语句是这样的:CREATE INDEX index_name ON table_name(column_name); 创建哈希索引的语句是这样的:CREATE INDEX index_name ON table_name(column_name) USING HASH; 创建全文索引的语句是这样的:CREATE FULLTEXT INDEX index_name ON table_name(column_name); 这些语句可是数据库操作中的必备技能,得好好掌握啊。

MySQL复习二

MySQL函数: 数学函数:
ABS(x):返回x的绝对值。

AVG(age):返回age字段的平均值。

CEIL(x)/CEILING(x):返回大于或等于x的最小整数。

FLOOR(x):返回小于或等于x的最大整数。

EXP(x):返回e的x次方。

GREATEST(expr1 ,expr2 ,expr3 ,...):返回列表中的最大值。

LEAST(expr1 ,expr2 ,expr3 ,...):返回列表中的最小值。

LN(x):返回数字的自然对数。

LOG(x):返回自然对数(以e为底)。

MAX(expression):返回expression的最大值。

MIN(expression):返回expression的最小值。

POW(x,y)/POWER(x,y):返回x的y次方。

RAND():返回0到1 的随机数。

ROUND(x):返回离x最近的整数。

SIGN(x):返回x的符号(-1 , 0, 1 )。

SQRT(x):返回x的平方根。

SUM(expression):返回expression的总和。

TRUNCATE(x,y):返回数值x保留到小数点后y位(不四舍五入)。

字符串函数:
ASCII(s):返回字符串s第一个字符的ASCII码。

LENGTH/CHAR_LENGTH(s)/CHARACTER_LENGTH(s):返回字符串s的字符数。

CONCAT(s1 ,s2 …sn):合并多个字符串。

FIND_IN_SET(s1 ,s2 ):返回s2 中s1 的位置。

FORMAT(x,n):格式化数字x,保留n位小数。

INSERT(s1 ,x,len,s2 ):用s2 替换s1 的x位置开始的len长度字符串。

LOCATE(s1 ,s):返回s中s1 的开始位置。

LCASE(s)/LOWER(s):将s转为小写。

UCASE(s)/UPPER(s):将s转为大写。

TRIM(s):去掉s的开始和结尾空格。

LTRIM(s):去掉s的开始空格。

RTRIM(s):去掉s的结尾空格。

SUBSTR(s,start,length)/SUBSTRING(s,start,length):截取s的start位置开始的length长度子字符串。

POSITION(s1 INs):返回s中s1 的开始位置。

REPEAT(s,n):将s重复n次。

REVERSE(s):反转s的顺序。

STRCMP(s1 ,s2 ):比较s1 和s2
日期函数:
CURDATE()/CURRENT_DATE():返回当前日期。

CURRENT_TIME()/CURTIME():返回当前时间。

CURRENT_TIMESTAMP():返回当前日期和时间。

ADDDATE(d,n):日期d加n天。

ADDTIME(t,n):时间t加n秒。

DATE():提取日期值。

DAY(d):返回d的日期部分。

DATEDIFF(d1 ,d2 ):计算d1 到d2 的天数差。

DATE_FORMAT(d,f):按f格式显示d。

DAYNAME(d):返回d是星期几。

DAYOFMONTH(d):返回d是本月的第几天。

DAYOFWEEK(d):返回d是星期几。

DAYOFYEAR(d):返回d是本年的第几天。

EXTRACT(typeFROMd):从d提取type指定的值。

UNIX_TIMESTAMP():返回时间戳。

FROM_UNIXTIME():时间戳转日期。

MySQL高级函数:
IF(expr,v1 ,v2 ):expr成立返回v1 ,否则返回v2
CONV(x,f1 ,f2 ):将f1 进制数x转为f2 进制。

CURRENT_USER()/SESSION_USER()/SYSTEM_USER()/USER():返回当前用户。

DATABASE():返回当前数据库名。

VERSION():返回数据库版本号。

事务:
事务将SQL语句放在同一批次执行,一个出错则全取消。

MySQL事务只支持InnoDB和BDB表类型,遵循ACID原则:
原子性:要么全完成,要么全不完成。

一致性:保持系统一致状态。

隔离性:事务好像是唯一操作。

持久性:事务完成后更改持久保存。

事务术语:
开启:StartTransaction。

结束:EndTransaction。

提交:CommitTransaction。

回滚:RollbackTransaction。

事务相关SQL:
commit:提交事务。

rollback:回滚事务。

索引:
索引作用:提高查询速度、确保数据唯一性、加速表连接、实现参照完整性、减少分组排序时间、优化全文检索。

索引分类:
主键索引:确保数据记录唯一性,确定记录位置。

唯一索引:避免数据列值重复。

常规索引:快速定位特定数据。

全文索引:用于全文检索。

索引准则:
索引不是越多越好。

不要对常变动数据加索引。

小表不建议加索引。

索引应加在查找条件字段。

hash索引:查询单条快,范围查询慢。

btree索引:b+树,层数多数据量指数增长(InnoDB默认支持)。

存储引擎不同支持的索引类型也不同,InnoDB支持B-tree、Full-text等,不支持Hash;MyISAM不支持事务,但支持B-tree、Full-text等。

MySQL 中的 key_len 为什么会大于索引列的长度?

对,key_len就是看索引占多少字节。
主要看字符编码,比如utf8 mb4 ,一个字符最多4 字节。

比如char(2 0),用utf8 mb4 ,2 0个字符就是8 0字节。
和记录数没关系,只看单行。

别搞错了,不是所有记录的索引总长度,是单条记录索引的最大长度。

查key_len,用EXPLAIN,看输出里的key_len。

复合索引,多列加起来。
前缀索引,只算前缀部分。

关键就是字符编码,utf8 mb4 下,一个字符最多4 字节。