mysql复合索引、普通索引总结

mysql复合索引、普通索引总结  

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。下面用几个例子对比查询条件的不同对性能影响.



create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

优: select * from test where a=10 and b>50
差: select * from test where a50

优: select * from test where order by a
差: select * from test where order by b
差: select * from test where order by c

优: select * from test where a=10 order by a
优: select * from test where a=10 order by b
差: select * from test where a=10 order by c

优: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b=10 order by b
优: select * from test where a=10 and b=10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c

索引原则

1.索引越少越好
原因:主要在修改数据时,每个索引都要进行更新,降低写速度。
2.最窄的字段放在键的左边
3.避免file sort排序,临时表和表扫描.
<think>好的,我现在要帮用户解决在MySQL中创建普通索引复合索引的方法及语法的问题。首先,我需要回顾一下用户提供的引用内容,确保回答准确。 用户提到了三个引用,其中引用[1]提到普通索引是最基本的,没有限制,可以在创建表或修改表时指定,而复合索引是对多个列创建的。引用[2]和引用[3]补充了索引的使用和自动创建的情况,比如主键、外键、唯一约束会自动生成索引,而普通索引复合索引需要手动创建。 接下来,我需要整理创建这两种索引的具体语法。对于普通索引,用户可能需要在创建表时使用INDEX关键字,或者之后使用CREATE INDEX语句。复合索引的语法类似,只是索引涉及多个列名。 需要注意的是,索引名称的命名规范,比如普通索引常用idx_列名,复合索引用idx_列名1_列名2等。还要提醒用户索引的维护,比如避免过多索引影响性能,选择合适的列作为索引。 用户可能还关心何时使用复合索引,比如查询条件涉及多个列的情况,这时候复合索引可以更有效。同时,覆盖索引的概念也需要提及,当查询的列都包含在索引中时,性能会更好。 最后,确保回答结构清晰,分点说明创建方法,并给出示例,这样用户更容易理解。同时,生成的相关问题需要与索引的优化、使用场景相关,帮助用户进一步学习。</think>在 MySQL 中创建普通索引复合索引的方法及语法如下: --- ### 一、普通索引创建方法 1. **创建表时直接指定** 使用 `INDEX` 关键字定义,语法: ```sql CREATE TABLE 表名 ( 列1 数据类型, 列2 数据类型, INDEX [索引名] (列名) ); ``` **示例**:为 `users` 表的 `username` 列创建普通索引 ```sql CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), INDEX idx_username (username) ); ``` 2. **修改表结构添加索引** 使用 `ALTER TABLE` 或 `CREATE INDEX` 语句: ```sql ALTER TABLE 表名 ADD INDEX [索引名] (列名); -- 或 CREATE INDEX 索引名 ON 表名 (列名); ``` **示例**:为已有表 `orders` 的 `order_date` 列添加索引 ```sql ALTER TABLE orders ADD INDEX idx_order_date (order_date); ``` --- ### 二、复合索引创建方法 复合索引需指定 **多个列名**,语法与普通索引类似: 1. **创建表时指定** ```sql CREATE TABLE 表名 ( 列1 数据类型, 列2 数据类型, 列3 数据类型, INDEX [索引名] (列1, 列2) ); ``` **示例**:为 `products` 表的 `category_id` 和 `price` 列创建复合索引 ```sql CREATE TABLE products ( id INT PRIMARY KEY, category_id INT, price DECIMAL(10,2), INDEX idx_category_price (category_id, price) ); ``` 2. **修改表结构添加** ```sql ALTER TABLE 表名 ADD INDEX [索引名] (列1, 列2); -- 或 CREATE INDEX 索引名 ON 表名 (列1, 列2); ``` **示例**:为已有表 `sales` 的 `region` 和 `sale_date` 列添加复合索引 ```sql CREATE INDEX idx_region_date ON sales (region, sale_date); ``` --- ### 三、注意事项 1. 索引命名建议:普通索引用 `idx_列名`,复合索引用 `idx_列1_列2` 格式[^3]; 2. 复合索引遵循 **最左前缀原则**,即查询条件需包含最左侧列才能生效[^2]; 3. 索引会占用存储空间,且影响写入性能,需根据查询需求合理设计[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值