Mysql建表与索引使用规范整理

本文档详细介绍了MySQL表设计规范,包括字段设置、索引使用及命名规则,并提供了SQL语句优化技巧,帮助提高数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一,设计表规范:
1. MySQL建表,字段需设置为非空,需设置字段默认值。

2. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

3. MySQL建表,如果字段等价于外键,应在该字段加索引。

4. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

5. MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

6. 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

7. 建立索引index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。

8. MySQL针对like语法必须如下格式才使用索引:

SELECT * FROM t1 WHERE key_col LIKE ‘ab%’ ;

9. SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

10. 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

11. 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

12. ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

13. 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

14.、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引。

15. 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

16. 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。

17. 定期使用慢日志检查语句,执行explain,分析可能改进的索引。

18. 条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。

二,命名规范 :
1.主键的命名采用如下规则:

主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。

2.外键的命名采用如下规则:

外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。

3.索引的命名采用如下规则:

1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符。

2)主键对应的索引和主键同名。

3)唯一性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名。

4)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则

5)索引基本语法
CREATE INDEX 索引名称 ON 表名(字段);
show index from 表名 ;
drop index 索引名称 on 表名;

6)唯一值越多的字段,使用索引的效果越好。设置联合索引时,唯一值越多的,越应该放在“左侧”。

三,SQL语句优化规范 :
1. 使用mysql explain 对sql执行效率进行检测 ,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
1) 使用方法:在select语句前加上explain即可
2) explain 分析结果形式如下:
table | type | possible_keys | key | key_len | ref | rows | Extra

explain 分析结果形式中各属性含义:
table :显示这一行的数据是关于哪张表的

type :这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys :显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key :实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra  :返回的描述的意义
2. 尽量使用 "inner join " 查询替换子查询条件中的 "in " ,防止由于数据量过大,引发数据库挂起问题

3.使用索引应注意问题:

1)查询语句的where条件后边使用 “!=”或“<>”时,索引不生效,和普通字段一样

2)查询语句的where条件后边使用字符串函数或其他函数,索引不生效,和普通字段一样

3)使用连接(join)查询时,只有在主键和外键的数据类型相同时索引才会生效

4)查询语句的where条件后边使用Like关键字应注意,like '%jx%' 和 like '%jx'方式索引均不生效, like 'jx%'方式索引生效

5)InnoDB数据表不支持全文索引

 

<think>好的,我现在需要回答用户关于如何在MySQL中创索引的问题。首先,我得确保自己理解用户的需求。用户可能对索引不太熟悉,所以需要从基础开始解释,同时提供具体的方法和示例。 根据用户提供的引用内容,特别是引用[2],里面提到了两种创索引的方法:在创时添加索引,以及在使用CREATE INDEX语句。我需要整理这两种方法的步骤,并给出示例代码。同时,引用[3]提到哈希索引,但可能用户更关注的是普通索引,不过可以简要提到哈希索引作为补充。 接下来,用户可能想知道如何验证索引是否创成功,这里引用[4]提到的EXPLAIN命令可以用来查看查询的执行计划,从而确认索引是否被使用。这也需要包含在回答中。 还要注意用户的问题中提到的系统级指令,比如使用正确的LaTeX格式,生成相关问题。我需要确保数学达式用$...$包裹,独立公式用$$...$$,但在这个问题中可能数学公式不,更的是代码示例。不过如果有涉及性能分析的公式,比如时间复杂度,可能需要用到。 然后,生成相关问题的时候,要考虑用户可能的后续疑问,比如索引的类型、优化方法、验证方式等。确保问题覆盖索引的创使用优化和验证等方面。 另外,引用[1]提到用户有三个疑问点,虽然具体是什么不清楚,但可能在创索引后的使用上有疑问,所以需要强调创后如何验证和使用索引。 最后,检查回答是否符合中文要求,结构是否清晰,分步骤说明,并引用正确的来源。同时确保代码示例正确,使用正确的SQL语法,比如CREATE INDEX和ALTER TABLE语句的区别,何时使用哪种方法。 总结步骤: 1. 介绍索引的作用和重要性。 2. 创索引的两种主要方法:时创后添加。 3. 提供具体的SQL示例,包括CREATE TABLE时添加索引,以及使用CREATE INDEX和ALTER TABLE添加索引。 4. 解释如何验证索引是否生效,使用SHOW INDEX和EXPLAIN命令。 5. 注意事项,如索引命名规范、避免过索引、选择合适的列。 6. 补充哈希索引的创方法,作为高级选项。 7. 生成相关问题,覆盖索引类型、优化、验证、选择依据等。 需要确保每个步骤都有对应的引用支持,比如引用[2]中的示例,引用[4]的EXPLAIN用法。同时避免使用用户不可见的格式,保持回答自然。</think>### 如何在 MySQL 中创索引教程 #### 一、索引的作用 索引是数据库中用于加速查询的数据结构,类似于书籍的目录。合理使用索引可将查询性能提升数倍,尤其是在处理百万级数据时[^2]。 --- #### 二、创索引的两种方法 ##### 1. **时创索引** 在定义结构的 `CREATE TABLE` 语句中直接指定索引: ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), department_id INT, salary DECIMAL(10, 2), INDEX idx_department (department_id), -- 普通索引 UNIQUE INDEX idx_name (name) -- 唯一索引 ); ``` 此处创了两个索引:普通索引 `idx_department` 和唯一索引 `idx_name`[^2]。 ##### 2. **后添加索引** 使用 `CREATE INDEX` 或 `ALTER TABLE` 语句动态添加: ```sql -- 方法1:CREATE INDEX CREATE INDEX idx_salary ON employees (salary); -- 方法2:ALTER TABLE ALTER TABLE employees ADD INDEX idx_department_salary (department_id, salary); ``` 第二种方法支持创复合索引列组合)。 --- #### 三、验证索引有效性 1. **查看索引** ```sql SHOW INDEX FROM employees; ``` 输出结果包含索引名称、列名、索引类型等信息。 2. **分析查询执行计划** ```sql EXPLAIN SELECT * FROM employees WHERE department_id = 5; ``` 若结果中 `key` 字段显示索引名称(如 `idx_department`),则说明索引已生效[^4]。 --- #### 四、注意事项 1. **命名规范** 使用 `idx_列名` 格式,如 `idx_salary`。 2. **避免过度索引** 每个索引会增加写操作的开销,通常单索引不超过5个。 3. **选择高区分度列** 优先在区分度高(如唯一值比例大)的列上索引,例如手机号字段比性别字段更适合[^3]。 --- #### 五、高级索引类型(哈希索引MySQL 的 MEMORY 存储引擎支持哈希索引,适合精确查找: ```sql CREATE TABLE url_cache ( url VARCHAR(255) PRIMARY KEY, content BLOB, INDEX url_hash USING HASH (url) ) ENGINE=MEMORY; ``` 哈希索引查询时间复杂度为 $O(1)$,但不支持范围查询。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值