高性能Mysql学习笔记-创建高性能索引

1.B-Tree创建一个伪哈希索引
新增一个被索引的crc列,使用CRC32做哈希
数据表大可以使用CRC64或者MD5取部分值,也可以使用FNV64()函数作为哈希函数(来自Percona Server插件)

2.索引的有点
减少需要扫描的数据量
避免排序和临时表
将随机I/O变为顺序I/O
索引存储实际列值

3.对于特大型表采用分区技术比建立索引更优

4.前缀索引优缺点
优点:使索引更小、更快
缺点:无法做ORDER BY和GROUP BY,无法做覆盖扫描

5.前缀索引的选择性
SELECT COUNT(DISTINCT col)/COUNT(*) FROM table
SELECT COUNT(DISTINCT LEFT(col,n)/COUNT(*) FROM table

6.optimizer_switch关闭索引合并功能

7.组合索引选择性
SELECT CONUNT(DISTINCT col1)/COUNT(*),
CONUNT(DISTINCT col2)/COUNT(*),
COUNT(*)
FROM table

SELECT COUNT(),SUM(col1=),SUM(col2=),SUM(col3=)FROM table

除了选择性和基数的经验法则外,还需要考虑WHERE子句中的排序、分组和范围条件等因素

8.使用UUID作为主键会影响插入速度以及占用更多的存储空间

9.OPTIMIZE TABLE 重建表并优化也填充

10.顺序主键也会造成更坏的结果
高并发,InnoDB会造成明显争用,可能导致间隙锁竞争以及AUTO_INCREMENT锁机制,此时可以考虑重新设计表或者应用,也可以更改innodb_autoinc_lock_mode配置

11.使用延迟关联复用覆盖索引
先利用二级索引来查主键ID,再通过主键ID使用覆盖索引获取数据
例如:
SELECT * FROM table
JOIN(
SELECT id FROM table
WHERE col=**
)AS T1 ON(t1.id=table.id)

12.组合索引前导列为常量时可以用组合索引排序

13.一些不能使用索引做排序的查询
使用两种不同的排序方向

引用了不在索引的列

查询条件与排序条件无法组成最左缀

前导列不是常量

查询多列时带有范围查询

14.解决冗余索引和重复索引方法
写一些复杂的访问INFORMATION_SCHEMA表的查询来找

使用Shlomi Noach的common_schema中的一些视图来定位

使用PerconaToolkit中的pt-duplicate-key-checker

使用Percona工具箱中的pt-upgrade工具来仔细检查计划中的索引变更

使用Percona Server或MariaDB中先打开userstates服务器变量,让服务器运行一段时间,再通过查询INFOMATION_SHEMA.INDEX_STATISTICS查询每个索引的使用率

使用Percona Toolkit中的pt-index-usage查询索引的使用率

15.使用IN()复用组合索引

16.CHECK TABLE能够找出大多数的表和索引的错误

17.ANALYZE TABLE重新生成统计信息

18.OPTIMIZE TABLE重新整理数据

19.使用pt-query-digest的查询审查“review”功能分析EXPLAIN出来的执行计划

20.InnoDB所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大

21.尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值