如题所述
MySQLç´¢å¼ç±»åå
æ¬ï¼
ä¸ãæ®éç´¢å¼
è¿æ¯æåºæ¬çç´¢å¼ï¼å®æ²¡æä»»ä½éå¶ãæ以ä¸å ç§å建æ¹å¼ï¼
1.å建索å¼
代ç å¦ä¸:
CREATE INDEX indexName ON mytable(username(length));
å¦ææ¯CHARï¼VARCHARç±»åï¼lengthå¯ä»¥å°äºå段å®é é¿åº¦ï¼å¦ææ¯BLOBåTEXTç±»åï¼å¿ é¡»æå® lengthï¼ä¸åã
2.ä¿®æ¹è¡¨ç»æ
代ç å¦ä¸:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- å建表çæ¶åç´æ¥æå®ã
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
-- å é¤ç´¢å¼çè¯æ³ï¼
DROP INDEX [indexName] ON mytable;
äºãå¯ä¸ç´¢å¼
å®ä¸åé¢çæ®éç´¢å¼ç±»ä¼¼ï¼ä¸åçå°±æ¯ï¼ç´¢å¼åçå¼å¿ é¡»å¯ä¸ï¼ä½å 许æ空å¼ãå¦ææ¯ç»åç´¢å¼ï¼ååå¼çç»åå¿ é¡»å¯ä¸ãå®æ以ä¸å ç§å建æ¹å¼ï¼
代ç å¦ä¸:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- ä¿®æ¹è¡¨ç»æ
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- å建表çæ¶åç´æ¥æå®
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
ä¸ã主é®ç´¢å¼
å®æ¯ä¸ç§ç¹æ®çå¯ä¸ç´¢å¼ï¼ä¸å 许æ空å¼ãä¸è¬æ¯å¨å»ºè¡¨çæ¶ååæ¶å建主é®ç´¢å¼ï¼
代ç å¦ä¸:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
å½ç¶ä¹å¯ä»¥ç¨ ALTER å½ä»¤ãè®°ä½ï¼ä¸ä¸ªè¡¨åªè½æä¸ä¸ªä¸»é®ã
åãç»åç´¢å¼
为äºå½¢è±¡å°å¯¹æ¯ååç´¢å¼åç»åç´¢å¼ï¼ä¸ºè¡¨æ·»å å¤ä¸ªå段ï¼
代ç å¦ä¸:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
为äºè¿ä¸æ¥æ¦¨åMySQLçæçï¼å°±è¦èè建ç«ç»åç´¢å¼ã
äºï¼ä½¿ç¨ç´¢å¼ç注æäºé¡¹
使ç¨ç´¢å¼æ¶ï¼æ以ä¸ä¸äºæå·§å注æäºé¡¹ï¼
1.ç´¢å¼ä¸ä¼å å«æNULLå¼çå
åªè¦åä¸å å«æNULLå¼é½å°ä¸ä¼è¢«å å«å¨ç´¢å¼ä¸ï¼å¤åç´¢å¼ä¸åªè¦æä¸åå«æNULLå¼ï¼é£ä¹è¿ä¸å对äºæ¤å¤åç´¢å¼å°±æ¯æ æçãæ以æ们å¨æ°æ®åºè®¾è®¡æ¶ä¸è¦è®©å段çé»è®¤å¼ä¸ºNULLã
2.使ç¨çç´¢å¼
对串åè¿è¡ç´¢å¼ï¼å¦æå¯è½åºè¯¥æå®ä¸ä¸ªåç¼é¿åº¦ãä¾å¦ï¼å¦ææä¸ä¸ªCHAR(255)çåï¼å¦æå¨å10个æ20个å符å ï¼å¤æ°å¼æ¯æä¸çï¼é£ä¹å°±ä¸è¦å¯¹æ´ä¸ªåè¿è¡ç´¢å¼ãçç´¢å¼ä¸ä» å¯ä»¥æé«æ¥è¯¢é度èä¸å¯ä»¥èçç£ç空é´åI/Oæä½ã
3.ç´¢å¼åæåº
MySQLæ¥è¯¢åªä½¿ç¨ä¸ä¸ªç´¢å¼ï¼å æ¤å¦æwhereåå¥ä¸å·²ç»ä½¿ç¨äºç´¢å¼çè¯ï¼é£ä¹order byä¸çåæ¯ä¸ä¼ä½¿ç¨ç´¢å¼çãå æ¤æ°æ®åºé»è®¤æåºå¯ä»¥ç¬¦åè¦æ±çæ åµä¸ä¸è¦ä½¿ç¨æåºæä½ï¼å°½éä¸è¦å å«å¤ä¸ªåçæåºï¼å¦æéè¦æ好ç»è¿äºåå建å¤åç´¢å¼ã
4.likeè¯å¥æä½
ä¸è¬æ åµä¸ä¸é¼å±ä½¿ç¨likeæä½ï¼å¦æé使ç¨ä¸å¯ï¼å¦ä½ä½¿ç¨ä¹æ¯ä¸ä¸ªé®é¢ãlike â%aaa%â ä¸ä¼ä½¿ç¨ç´¢å¼èlike âaaa%âå¯ä»¥ä½¿ç¨ç´¢å¼ã
5.ä¸è¦å¨åä¸è¿è¡è¿ç®
select * from users where YEAR(adddate)<2007;
å°å¨æ¯ä¸ªè¡ä¸è¿è¡è¿ç®ï¼è¿å°å¯¼è´ç´¢å¼å¤±æèè¿è¡å ¨è¡¨æ«æï¼å æ¤æ们å¯ä»¥æ¹æ:
select * from users where adddate<â2007-01-01';
6.ä¸ä½¿ç¨NOT INå<>æä½ã
ä¸ï¼sqlä¼ååå
常è§çç®åè§åå¦ä¸ï¼
1.ä¸è¦æè¶ è¿5个以ä¸ç表è¿æ¥ï¼JOINï¼
2.èè使ç¨ä¸´æ¶è¡¨æ表åéåæ¾ä¸é´ç»æã
3.å°ç¨åæ¥è¯¢
4.è§å¾åµå¥ä¸è¦è¿æ·±,ä¸è¬è§å¾åµå¥ä¸è¦è¶ è¿2个为å®ã
5.è¿æ¥ç表è¶å¤ï¼å ¶ç¼è¯çæ¶é´åè¿æ¥çå¼éä¹è¶å¤§ï¼æ§è½è¶ä¸å¥½æ§å¶ã
6.æ好æ¯æè¿æ¥æå¼æè¾å°çå 个é¨åé个顺åºæ§è¡ã
7.ä¼å æ§è¡é£äºè½å¤å¤§éåå°ç»æçè¿æ¥ã
8.æåç好å¤ä¸ä» ä» æ¯åå°SQL Serverä¼åçæ¶é´ï¼æ´ä½¿å¾SQLè¯å¥è½å¤ä»¥ä½ å¯ä»¥é¢æµçæ¹å¼å顺åºæ§è¡ã
å¦æä¸å®éè¦è¿æ¥å¾å¤è¡¨æè½å¾å°æ°æ®ï¼é£ä¹å¾å¯è½æå³ç设计ä¸ç缺é·ã
ä¸ãæ®éç´¢å¼
è¿æ¯æåºæ¬çç´¢å¼ï¼å®æ²¡æä»»ä½éå¶ãæ以ä¸å ç§å建æ¹å¼ï¼
1.å建索å¼
代ç å¦ä¸:
CREATE INDEX indexName ON mytable(username(length));
å¦ææ¯CHARï¼VARCHARç±»åï¼lengthå¯ä»¥å°äºå段å®é é¿åº¦ï¼å¦ææ¯BLOBåTEXTç±»åï¼å¿ é¡»æå® lengthï¼ä¸åã
2.ä¿®æ¹è¡¨ç»æ
代ç å¦ä¸:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- å建表çæ¶åç´æ¥æå®ã
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
-- å é¤ç´¢å¼çè¯æ³ï¼
DROP INDEX [indexName] ON mytable;
äºãå¯ä¸ç´¢å¼
å®ä¸åé¢çæ®éç´¢å¼ç±»ä¼¼ï¼ä¸åçå°±æ¯ï¼ç´¢å¼åçå¼å¿ é¡»å¯ä¸ï¼ä½å 许æ空å¼ãå¦ææ¯ç»åç´¢å¼ï¼ååå¼çç»åå¿ é¡»å¯ä¸ãå®æ以ä¸å ç§å建æ¹å¼ï¼
代ç å¦ä¸:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- ä¿®æ¹è¡¨ç»æ
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- å建表çæ¶åç´æ¥æå®
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
ä¸ã主é®ç´¢å¼
å®æ¯ä¸ç§ç¹æ®çå¯ä¸ç´¢å¼ï¼ä¸å 许æ空å¼ãä¸è¬æ¯å¨å»ºè¡¨çæ¶ååæ¶å建主é®ç´¢å¼ï¼
代ç å¦ä¸:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
å½ç¶ä¹å¯ä»¥ç¨ ALTER å½ä»¤ãè®°ä½ï¼ä¸ä¸ªè¡¨åªè½æä¸ä¸ªä¸»é®ã
åãç»åç´¢å¼
为äºå½¢è±¡å°å¯¹æ¯ååç´¢å¼åç»åç´¢å¼ï¼ä¸ºè¡¨æ·»å å¤ä¸ªå段ï¼
代ç å¦ä¸:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
为äºè¿ä¸æ¥æ¦¨åMySQLçæçï¼å°±è¦èè建ç«ç»åç´¢å¼ã
äºï¼ä½¿ç¨ç´¢å¼ç注æäºé¡¹
使ç¨ç´¢å¼æ¶ï¼æ以ä¸ä¸äºæå·§å注æäºé¡¹ï¼
1.ç´¢å¼ä¸ä¼å å«æNULLå¼çå
åªè¦åä¸å å«æNULLå¼é½å°ä¸ä¼è¢«å å«å¨ç´¢å¼ä¸ï¼å¤åç´¢å¼ä¸åªè¦æä¸åå«æNULLå¼ï¼é£ä¹è¿ä¸å对äºæ¤å¤åç´¢å¼å°±æ¯æ æçãæ以æ们å¨æ°æ®åºè®¾è®¡æ¶ä¸è¦è®©å段çé»è®¤å¼ä¸ºNULLã
2.使ç¨çç´¢å¼
对串åè¿è¡ç´¢å¼ï¼å¦æå¯è½åºè¯¥æå®ä¸ä¸ªåç¼é¿åº¦ãä¾å¦ï¼å¦ææä¸ä¸ªCHAR(255)çåï¼å¦æå¨å10个æ20个å符å ï¼å¤æ°å¼æ¯æä¸çï¼é£ä¹å°±ä¸è¦å¯¹æ´ä¸ªåè¿è¡ç´¢å¼ãçç´¢å¼ä¸ä» å¯ä»¥æé«æ¥è¯¢é度èä¸å¯ä»¥èçç£ç空é´åI/Oæä½ã
3.ç´¢å¼åæåº
MySQLæ¥è¯¢åªä½¿ç¨ä¸ä¸ªç´¢å¼ï¼å æ¤å¦æwhereåå¥ä¸å·²ç»ä½¿ç¨äºç´¢å¼çè¯ï¼é£ä¹order byä¸çåæ¯ä¸ä¼ä½¿ç¨ç´¢å¼çãå æ¤æ°æ®åºé»è®¤æåºå¯ä»¥ç¬¦åè¦æ±çæ åµä¸ä¸è¦ä½¿ç¨æåºæä½ï¼å°½éä¸è¦å å«å¤ä¸ªåçæåºï¼å¦æéè¦æ好ç»è¿äºåå建å¤åç´¢å¼ã
4.likeè¯å¥æä½
ä¸è¬æ åµä¸ä¸é¼å±ä½¿ç¨likeæä½ï¼å¦æé使ç¨ä¸å¯ï¼å¦ä½ä½¿ç¨ä¹æ¯ä¸ä¸ªé®é¢ãlike â%aaa%â ä¸ä¼ä½¿ç¨ç´¢å¼èlike âaaa%âå¯ä»¥ä½¿ç¨ç´¢å¼ã
5.ä¸è¦å¨åä¸è¿è¡è¿ç®
select * from users where YEAR(adddate)<2007;
å°å¨æ¯ä¸ªè¡ä¸è¿è¡è¿ç®ï¼è¿å°å¯¼è´ç´¢å¼å¤±æèè¿è¡å ¨è¡¨æ«æï¼å æ¤æ们å¯ä»¥æ¹æ:
select * from users where adddate<â2007-01-01';
6.ä¸ä½¿ç¨NOT INå<>æä½ã
ä¸ï¼sqlä¼ååå
常è§çç®åè§åå¦ä¸ï¼
1.ä¸è¦æè¶ è¿5个以ä¸ç表è¿æ¥ï¼JOINï¼
2.èè使ç¨ä¸´æ¶è¡¨æ表åéåæ¾ä¸é´ç»æã
3.å°ç¨åæ¥è¯¢
4.è§å¾åµå¥ä¸è¦è¿æ·±,ä¸è¬è§å¾åµå¥ä¸è¦è¶ è¿2个为å®ã
5.è¿æ¥ç表è¶å¤ï¼å ¶ç¼è¯çæ¶é´åè¿æ¥çå¼éä¹è¶å¤§ï¼æ§è½è¶ä¸å¥½æ§å¶ã
6.æ好æ¯æè¿æ¥æå¼æè¾å°çå 个é¨åé个顺åºæ§è¡ã
7.ä¼å æ§è¡é£äºè½å¤å¤§éåå°ç»æçè¿æ¥ã
8.æåç好å¤ä¸ä» ä» æ¯åå°SQL Serverä¼åçæ¶é´ï¼æ´ä½¿å¾SQLè¯å¥è½å¤ä»¥ä½ å¯ä»¥é¢æµçæ¹å¼å顺åºæ§è¡ã
å¦æä¸å®éè¦è¿æ¥å¾å¤è¡¨æè½å¾å°æ°æ®ï¼é£ä¹å¾å¯è½æå³ç设计ä¸ç缺é·ã
温馨提示:答案为网友推荐,仅供参考
第1个回答 2021-03-16
大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的操作会导致很多慢查。举例来说:
select * from tab where a=1 and b=2;
场景 1
符合 a=1的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。
场景 2
符合 a=1的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。
Tips:
创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;
需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。