MySQL 8.0 引入了函数索引,打破了传统观念,允许在索引中使用函数,提升查询性能。通过创建基于表达式的索引,如 `CONCAT`、`SUBSTRING_INDEX`、`YEAR`、`MONTH` 等,可以优化涉及这些函数的查询。虽然提高了某些查询速度,但也会增加数据维护成本。应谨慎使用,确保表达式确定且适用于常见查询模式。示例包括基于字符串、日期、数学运算和JSON属性的索引。
**摘要:**
CPU 利用率衡量了CPU被程序占用的程度,反映了一段时间内CPU忙碌的程度。在多任务操作系统中,CPU通过时间片分配给各进程实现“并发”。Linux命令如`uptime`、`top`、`w`和`vmstat`可用来监控CPU利用率。`vmstat`中的`%us`、`%sy`、`%id`等指标揭示了不同状态的CPU使用情况。`top`命令则实时显示进程资源占用。CPU利用率过高可能表明系统负载过大或程序问题,需要优化。Java应用中,CPU飙高可能由内存泄漏或死循环引起,需使用jstack等工具排查。
MySQL中的`INSERT INTO ... ON DUPLICATE KEY UPDATE`语句实现insertOrUpdate功能,当遇到重复键时,会更新已有记录。该操作需要表有主键或唯一索引,且冲突时加临时键锁可能引发死锁。例如,向student表插入数据,如果id已存在则更新name和age。底层实现包括检查唯一索引、处理冲突和执行更新。类似语句有REPLACE INTO和INSERT IGNORE INTO。在主键冲突更新时,自增主键计数器仍会增加,即使未实际插入新记录。
在MySQL中,悲观锁通过`SELECT ... FOR UPDATE`在InnoDB引擎实现,需关闭自动提交,确保数据修改时的独占性,防止并发修改。乐观锁则利用CAS机制,通过版本号避免冲突,更新时检查数据是否已变更。悲观锁适合写操作频繁且并发高的场景,乐观锁适合读多写少,效率较高但可能导致更新失败。选择哪种锁取决于业务需求和并发情况。
共享锁(读锁)允许并发读取数据,阻止修改;排他锁(写锁)则允许读取和修改,排斥其他锁。在MySQL中,`SELECT ... LOCK IN SHARE MODE;`添加共享锁,`SELECT ... FOR UPDATE;`添加排他锁。意向锁用于多粒度锁定,解决行锁与表锁的并发问题,分为意向共享锁(读)和意向排他锁(写),在事务请求行锁或表锁时自动获取,释放于事务结束。
InnoDB存储引擎的锁分为共享锁(S锁,读锁)和排他锁(X锁,写锁)。共享锁允许多个事务并发读取数据,不允许修改;排他锁允许读取和修改数据,阻止其他事务加锁。SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE分别用于获取共享锁和排他锁。此外,还有意向锁(IX,IS)用于协调行级锁和表级锁的并发问题,意向锁在事务请求锁时自动获取。记录锁锁定索引记录,插入记录锁用于插入操作前的间隙锁定,而AUTO-INC锁确保自增列的有序性。
索引下推是MySQL 5.6引入的优化,允许部分WHERE条件在索引中处理,减少回表次数。例如,对于索引(zipcode, lastname, firstname),查询`WHERE zipcode='95054' AND lastname LIKE '%etrunia%'`时,索引下推先过滤zipcode,然后在索引中应用lastname条件,降低回表需求。索引下推可在EXPLAIN的`Using index condition`中看到。