struct zcoder_tb { int id; // primary key string name; // key string phone; // key short age; }; map// 聚簇索引 map // 辅助索引 map // 辅助索引
PRIMARY KEY(key1, key2)
UNIQUE(key1, key2)
INDEX(key1, key2) -- OR KEY(key1, key2)
INDEX(key1, key2) UNIQUE(key1, key2) PRIMARY KEY(key1, key2)
select * from user where id >= 18 and id < 40;
-- 某个表包含 id、name、lockyNum; id 是主键,lockyNum 是辅助索引; select * from user where lockyNum = 33;
explain select * from zcoder_tb where name like '%张';
from_unixtime(idx) = '2024-02-21'; # 索引失效 idx = unix_timestamp("2024-02-21") # 索引有效
id <> 0; # 索引失效 idx > 0 or idx < 0; # 索引有效
有时候需要索引很长的字符串,这会让索引变的大且慢。 通常情况下可以使用某个列开始的部分字符串作为索引,这样大大的节约索引空间,从而提高索引效率。 但这会降低索引的区分度,索引的区分度是指不重复的索引值和数据表记录总数的比值。 索引的区分度越高则查询效率越高,因为区分度更高的索引可以让 MySQL 在查找的时候过滤掉更多的行。 对于 BLOB , TEXT , VARCHAR 类型的列,必要时使用前缀索引。 因为 MySQL 不允许索引这些列的完整长度,使用该方法的诀窍在于要选择足够长的前缀以保证较高的区分度。 select count(distinct left(name,3))/count(*) as sel3, count(distinct left(name,4))/count(*) as sel4, count(distinct left(name,5))/count(*) as sel5, count(distinct left(name,6))/count(*) as sel6, from user; alter table user add key(name(4));
select @@innodb_adaptive_hash_index; set global innodb_adaptive_hash_index=1; -- 默认是开启的 select @@innodb_change_buffer_max_size; -- 默认值为 25,表示最多使用 1/4 的缓冲池内存空间,最大值为 50 set global innodb_change_buffer_max_size=30;
show processlist:查看连接线程,可以查看此时线上运行的 SQL 语句。 如果要查看完整的 SQL 语句:SHOW FULL PROCESSLIST, 然后优化该语句。
-- 查看 SHOW GLOBAL VARIABLES LIKE 'slow_query%'; SHOW GLOBAL VARIABLES LIKE 'long_query%'; -- 设置 SET GLOBAL slow_query_log = ON; -- on 开启,off 关闭 SET GLOBAL long_query_time = 4; -- 单位秒;默认 10s;此时设置为 4s # 或者修改配置 slow_query_log = ON long_query_time = 4 slow_query_log_file = D:/mysql/mysql57-slow.log # 查找最近 10 条慢查询日志,-s t:按每个查询所花费的总时间对输出进行排序 mysqldumpslow -s t -t 10 -g 'select' D:/mysql/mysql57-slow.log
primary key、unique key、foreign key、default、not null
create table parent (id int not null, primary key(id)) engine=innodb; create table child (id int, parent_id int, foreign key(parent_id) references parent(id) ON DELETE CASCADE ON UPDATE CASCADE) engine=innodb; -- 被引用的表为父表,引用的表称为子表; -- 外键定义时,可以设置行为 ON DELETE 和 ON UPDATE,行为发生时的操作可选择: -- CASCADE 子表做同样的行为 -- SET NULL 更新子表相应字段为 NULL -- NO ACTION 父类做相应行为报错 -- RESTRICT 同 NO ACTION
上一篇:MySQL--索引结构