设计联系人表的时候,设想用uid和cid作联合索引,把uid放在前面,提高用uid查询的速度(clustered index),结果在实际查询中发现:
1,建表的时候根本不能把`uid`放在key的前面,必须放在后面 PRIMARY key(`cid`,`uid`)
如果这样的话,把Uid作为联合主键一点意义没有,最初的“为了查询而优化”的设计全是拍脑袋的决定!!
mysql> explain select * from contact where uid=1234567890;
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | contact | ALL | NULL | NULL | NULL | NULL | 1 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
做方案还是需要对每一个点进行测试,避免提前“思考”优化。
DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact` (
`cid` bigint AUTO_INCREMENT NOT NULL,
`uid` bigint NOT NULL,
`email` varchar(128) NOT NULL,
`name` varchar(64) NOT NULL,
`mobile` varchar(16) NULL,
`atime` timestamp NULL,
`type` enum('BLACK','WHITE','NORMAL') NOT NULl default 'NORMAL',
`info` text NULL,
`memo` varchar(1024) NULL,
PRIMARY key(`uid`,`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT = 100;
ALTER TABLE `contact` ADD UNIQUE INDEX uniq_uid_email(`uid`,`email`);
Clustered Index 是与物理数据混在一起并对物理数据进重排,就像使用拼音查字典;Unclustered Index 是与物理数据完全分离的,利用额外空间对关键字进行重排,就像使用部首查字典。
1.直接创建索引和间接创建索引
直接创建索引: CREATE INDEX mycolumn_index ON mytable (myclumn)
间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引
2.普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
3.单个索引和复合索引
单个索引:即非复合索引
复合索引:又叫组合索引,在索引建立语句中同时包含多个字段名,最多16个字段
CREATE INDEX name_index ON username(firstname,lastname)
4.聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH
ALLOW_DUP_ROW(允许有重复记录的聚簇索引)
非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn
索引的使用
1.当字段数据更新频率较低,查询使用频率较高并且存在大量重复值是建议使用聚簇索引
2.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
3.复合索引的前导列一定好控制好,否则无法起到索引的效果。如果查询时前导列不在查询条件中则该复合索引不会被使用。前导列一定是使用最频繁的列
4.多表操作在被实际执行前,查询优化器会
分享到:
相关推荐
### MySQL索引最佳实践 #### 理解索引的重要性 ...合理的设计和使用索引可以极大地提高MySQL数据库的性能。通过深入理解不同的索引类型及其工作原理,开发者和DBA能够更好地优化他们的应用程序并避免常见的性能陷阱。
MySQL中的索引也有类似的设计,例如BTREE索引。每个节点包含了主键ID,当通过主键ID查询数据时,首先会查询索引库以快速定位到具体的数据记录。 ##### 1.1.2 索引的分类 在MySQL中,索引可以根据不同的标准进行...
应根据应用需求选择合适的存储引擎,合理设计索引结构,同时关注索引带来的存储和性能影响,以实现数据库的最佳运行状态。在实践中,定期评估和调整索引策略,结合具体的业务场景进行优化,是保持数据库高效运行的...
合理的索引设计可以显著提高查询效率,减少服务器资源的消耗。在MySQL中,索引的选择与配置对于开发人员和数据库管理员来说至关重要。不恰当的索引设置往往会导致生产环境中出现各种问题,比如查询速度慢、资源占用...
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
MySQL 索引类型大汇总 MySQL 索引类型是数据库性能优化的关键所在。索引可以大幅度提高查询速度,提高数据库的高效运行。在 MySQL 中,索引可以分为单列索引和组合索引两种。 1. 普通索引 普通索引是最基本的索引...
MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...
7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7...
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...
2. **索引优化**:合理选择索引类型和设计索引方案对于提高查询效率至关重要。例如,在经常被用作查询条件的列上创建索引可以显著提高查询速度。 3. **索引维护**:定期检查并优化索引结构也是必要的,以确保索引...
### MySQL索引分析和优化 #### 一、索引的重要性及原理 索引在数据库管理中扮演着极其重要的角色,特别是在提高数据检索速度方面。...通过合理设计和使用索引,可以显著提升MySQL数据库系统的性能和响应速度。
【MySQL索引 使用笔记】 MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的...
由浅入深探究mysql索引结构原理、性能分析与优化
### MySQL索引和锁机制详解 #### 一、索引基础 **索引定义:** 索引是MySQL中用于提高查询效率的一种数据结构。通过索引可以在数据表中快速定位到...理解这些概念对于优化MySQL性能、设计高效的数据访问策略至关重要。
本资源详细解释了MySQL索引的出现原因以及一些常见的面试问题
### MySQL数据库及索引详解 #### 一、MySQL简介与数据库发展 MySQL是一款非常流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发。它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中...